コード例 #1
0
 public VoicemailScriptProcessor(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, VoicemailService vmService, PBXRegistrarService registrarService, Utilities.PluginManagement.PluginManager pluginManager)
 {
     this.extension = extension;
     this.vmService = vmService;
     this.registrarService = registrarService;
     this.pluginManager = pluginManager;
 }
コード例 #2
0
 public Click2CallScriptProcessor(ScriptService scriptService, string numberToDial, WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow callMakerExtension, TelecomScriptInterface callMakerInterface)
 {
     this.callMakerExtension = callMakerExtension;
     this.scriptService      = scriptService;
     this.numberToDial       = numberToDial;
     this.callMakerInterface = callMakerInterface;
 }
コード例 #3
0
        public void ProcessExtensionAuthentication(PreprocessSipRequestEventArgs e)
        {
            try
            {
                SIPURI fromURI = new SIPURI(e.Request.HeaderFields["From", "f"].FieldValue);

                // Is this coming from an internal extension
                WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, Convert.ToInt32(fromURI.User));

                if (extension != null)
                {
                    if (ProcessRequestAuthorization(e, fromURI, false))
                    {
                        e.Handled = false;
                    }
                    else
                    {
                        e.Handled = true;
                    }
                }
            }
            catch
            {
            }
        }
コード例 #4
0
        protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider)
        {
            string scriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Outbound Call.xml";

            if (File.Exists(scriptLocation))
            {
                IMLScript imlScript = IMLScript.OpenScript(scriptLocation);

                tsInterface.IMLInterpreter.SetLocalVariable("HoldMusicLocation", WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.HoldMusicRootDirectory));

                tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory));

                WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, outboundExtensionNumber);

                // If the outbound ts interface is null, then this means we don't have any available lines to make outbound calls.
                // Also check to see if this extension is allowed to make outbound calls
                if (outboundTsInterface == null || (outboundExtensionNumber >= 0 && extension != null && !extension.EnableOutboundCalls))
                {
                    tsInterface.IMLInterpreter.SignalCallFailure();
                    outboundTsInterface.Locked = false;
                }
                else
                {
                    // Link to our outbound script processor and start it
                    outboundTsInterface.ScriptProcessor.LinkScriptProcessor(this);
                    outboundTsInterface.ScriptProcessor.StartProcessing(outboundTsInterface, telecomProvider, dataProvider);
                }
            }
        }
コード例 #5
0
        /*public bool ExecuteScript(string scriptToRun, System.Collections.Specialized.NameValueCollection scriptVariables)
         * {
         *  if (File.Exists(scriptToRun))
         *  {
         *      int openLine = FindAndHoldOpenLine();
         *
         *      if (openLine != 0)
         *      {
         *          tsInterfaces[openLine].ScriptProcessor = new AutoScriptProcessor(scriptToRun, scriptVariables);
         *          tsInterfaces[openLine].ScriptProcessor.StartProcessing(tsInterfaces[openLine], telecomProvider, dataProvider);
         *
         *          return true;
         *      }
         *  }
         *
         *  return false;
         * }*/
        #endregion

        #region Click to Call Functions
        public bool Click2Call(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, string toNumber, bool autoAnswer)
        {
            // Check to see if there is an open line first
            int lineNumber1 = FindAndHoldOpenLine();

            if (lineNumber1 > 0)
            {
                int lineNumber2 = FindAndHoldOpenLine();

                if (lineNumber2 == 0)
                {
                    ReleaseHeldLine(lineNumber1);
                }
                else
                {
                    tsInterfaces[lineNumber1].ScriptProcessor = new Click2CallScriptProcessor(this, toNumber, extension, tsInterfaces[lineNumber2]);
                    tsInterfaces[lineNumber1].ScriptProcessor.StartProcessing(tsInterfaces[lineNumber1], telecomProvider, dataProvider);

                    tsInterfaces[lineNumber2].ScriptProcessor = new ExtensionScriptProcessor(this, tsInterfaces[lineNumber1], extension, vmMailerService, registrarService /*, extStateService*/, true, false, autoAnswer);
                    tsInterfaces[lineNumber2].ScriptProcessor.StartProcessing(tsInterfaces[lineNumber2], telecomProvider, dataProvider);
                    return(true);
                }
            }

            return(false);
        }
コード例 #6
0
 public VoicemailScriptProcessor(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, VoicemailService vmService, PBXRegistrarService registrarService, Utilities.PluginManagement.PluginManager pluginManager)
 {
     this.extension        = extension;
     this.vmService        = vmService;
     this.registrarService = registrarService;
     this.pluginManager    = pluginManager;
 }
コード例 #7
0
        void DataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && e.ColumnIndex == cbColumn.Index)
            {
                // Set all the other checkboxes to false
                foreach (DataGridViewRow row in extensionsView.DataGridView.Rows)
                {
                    if (e.RowIndex != row.Index)
                    {
                        row.SetValues(false);
                    }
                    else
                    {
                        bool newValue = !(bool)extensionsView.DataGridView[e.ColumnIndex, e.RowIndex].Value;
                        row.SetValues(newValue);
                    }
                }

                if ((bool)extensionsView.DataGridView[e.ColumnIndex, e.RowIndex].Value == true)
                {
                    WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = (WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow)((DataRowView)extensionsView.DataGridView.Rows[e.RowIndex].DataBoundItem).Row;

                    ManagementInterfaceClient.ManagementInterface.SetReceptionistExtension(ManagementInterfaceClient.AuthInfo, extension.ExtensionID);
                }
                else
                {
                    ManagementInterfaceClient.ManagementInterface.SetReceptionistExtension(ManagementInterfaceClient.AuthInfo, Guid.Empty);
                }
            }
        }
コード例 #8
0
 public Click2CallScriptProcessor(ScriptService scriptService, string numberToDial, WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow callMakerExtension, TelecomScriptInterface callMakerInterface)
 {
     this.callMakerExtension = callMakerExtension;
     this.scriptService = scriptService;
     this.numberToDial = numberToDial;
     this.callMakerInterface = callMakerInterface;
 }
 public TransferConferenceParticipantScriptProcessor(int conferenceID, TelecomScriptInterface extensionTsInterface, WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, VoicemailMailerService vmMailerService)
 {
     this.extensionTsInterface = extensionTsInterface;
     this.vmMailerService = vmMailerService;
     this.conferenceID = conferenceID;
     this.extension = extension;
 }
 public TransferConferenceParticipantScriptProcessor(int conferenceID, TelecomScriptInterface extensionTsInterface, WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, VoicemailMailerService vmMailerService)
 {
     this.extensionTsInterface = extensionTsInterface;
     this.vmMailerService      = vmMailerService;
     this.conferenceID         = conferenceID;
     this.extension            = extension;
 }
コード例 #11
0
        private void EditExtension(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension)
        {
            short currentExt = extension.ExtensionNumber;

            // Get our extension contact numbers
            WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersDataTable contactNumbersTable = ManagementInterfaceClient.ManagementInterface.GetExtensionContactNumbers(ManagementInterfaceClient.AuthInfo, extension.ExtensionID);

            // Get our extension greeting
            WOSI.CallButler.Data.CallButlerDataset.LocalizedGreetingsDataTable voicemailGreetings = ManagementInterfaceClient.ManagementInterface.GetLocalizedGreeting(ManagementInterfaceClient.AuthInfo, extension.ExtensionID, ManagementInterfaceClient.ManagementInterface.GetDefaultLanguage(ManagementInterfaceClient.AuthInfo));
            WOSI.CallButler.Data.CallButlerDataset.LocalizedGreetingsRow       voicemailGreeting  = null;

            if (voicemailGreetings.Count > 0)
            {
                voicemailGreeting = voicemailGreetings[0];

                // Download our greeting sound if it exists
                Utils.GreetingUtils.GetLocalizedGreetingSound(voicemailGreeting);
            }
            else
            {
                // If the greeting doesn't exist, create a new one
                voicemailGreeting                     = voicemailGreetings.NewLocalizedGreetingsRow();
                voicemailGreeting.GreetingID          = extension.ExtensionID;
                voicemailGreeting.LocalizedGreetingID = Guid.NewGuid();
                voicemailGreeting.LanguageID          = ManagementInterfaceClient.ManagementInterface.GetDefaultLanguage(ManagementInterfaceClient.AuthInfo);
                voicemailGreeting.Type                = (short)WOSI.CallButler.Data.GreetingType.SoundGreeting;
                voicemailGreetings.AddLocalizedGreetingsRow(voicemailGreeting);
            }

            WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable origExt = (WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable)callButlerDataset.Extensions.Copy();


            // Show our extension editor form
            Forms.ExtensionEditorForm extensionForm = new CallButler.Manager.Forms.ExtensionEditorForm(callButlerDataset.Extensions, extension, contactNumbersTable, voicemailGreeting);

            if (extensionForm.ShowDialog(this) == DialogResult.OK)
            {
                // Check to make sure the extension isn't already taken
                if (currentExt != extension.ExtensionNumber && origExt.Select("ExtensionNumber = " + extension.ExtensionNumber).Length > 0)
                {
                    MessageBox.Show(this, String.Format(CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.ExtensionView_ExtTaken), extension.ExtensionNumber, currentExt), CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.ExtensionView_ExtConflict), MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    extension.ExtensionNumber = currentExt;
                }

                // Edit our remote extension
                WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable extensionDataTable = Utils.TableUtils <WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable> .CreateTableFromRow(extension);

                ManagementInterfaceClient.ManagementInterface.PersistExtension(ManagementInterfaceClient.AuthInfo, extensionDataTable);

                // Edit our remote greeting
                ManagementInterfaceClient.ManagementInterface.PersistLocalizedGreeting(ManagementInterfaceClient.AuthInfo, voicemailGreetings);

                // Send our voicemail greeting sound file
                Utils.GreetingUtils.PersistLocalizedGreetingSound(voicemailGreeting);

                ManagementInterfaceClient.ManagementInterface.PersistExtensionContactNumbers(ManagementInterfaceClient.AuthInfo, contactNumbersTable);
            }
        }
コード例 #12
0
 public TransferConferenceScriptProcessor(int conferenceID, ScriptService scriptService, ScriptProcessing.TelecomScriptInterface callerTsInterface, PBXRegistrarService pbxRegistrar, WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, VoicemailMailerService vmMailerService)
 {
     this.callerTsInterface = callerTsInterface;
     this.vmMailerService = vmMailerService;
     this.scriptService = scriptService;
     this.conferenceID = conferenceID;
     this.pbxRegistrar = pbxRegistrar;
     this.extension = extension;
 }
コード例 #13
0
        public void QueueVoicemailEmail(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, WOSI.CallButler.Data.CallButlerDataset.VoicemailsRow voicemail)
        {
            VoicemailData vmData = new VoicemailData();

            vmData.Extension = extension;
            vmData.Voicemail = voicemail;

            vmMailQueue.Enqueue(vmData);
        }
コード例 #14
0
 public TransferConferenceScriptProcessor(int conferenceID, ScriptService scriptService, ScriptProcessing.TelecomScriptInterface callerTsInterface, PBXRegistrarService pbxRegistrar, WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, VoicemailMailerService vmMailerService)
 {
     this.callerTsInterface = callerTsInterface;
     this.vmMailerService   = vmMailerService;
     this.scriptService     = scriptService;
     this.conferenceID      = conferenceID;
     this.pbxRegistrar      = pbxRegistrar;
     this.extension         = extension;
 }
コード例 #15
0
        public void SendMessageWaitingNotification(int extensionNumber)
        {
            WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, extensionNumber);

            if (extension != null)
            {
                SendMessageWaitingNotification(extension);
            }
        }
コード例 #16
0
        private void dgExtensions_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == NewMessagesColumn.Index)
            {
                // Get our new messages count
                WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = (WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow)((DataRowView)dgExtensions.Rows[e.RowIndex].DataBoundItem).Row;

                e.Value = callButlerDataset.Voicemails.Compute("COUNT(IsNew)", "ExtensionID = '" + extension.ExtensionID.ToString() + "' AND IsNew = True").ToString() + " new " + callButlerDataset.Voicemails.Compute("COUNT(IsNew)", "ExtensionID = '" + extension.ExtensionID.ToString() + "'").ToString() + " total";
            }
        }
コード例 #17
0
        private void cboExtension_SelectedIndexChanged(object sender, EventArgs e)
        {
            if ((WOSI.CallButler.Data.ExtensionContactNumberType)contactRow.Type == WOSI.CallButler.Data.ExtensionContactNumberType.Extension && cboExtension.SelectedItem != null)
            {
                WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = (WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow)((global::Controls.ListBoxExItem)cboExtension.SelectedItem).Tag;

                contactRow.ContactNumber = extension.ExtensionID.ToString();

                lblNumber.Text = cboExtension.SelectedItem.ToString();
            }
        }
コード例 #18
0
        private void dgExtensions_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == PlayMessagesColumn.Index)
            {
                WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = (WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow)((DataRowView)dgExtensions.Rows[e.RowIndex].DataBoundItem).Row;

                Forms.AnsweringMachineForm amForm = new CallButler.Manager.Forms.AnsweringMachineForm(callButlerDataset, extension.ExtensionID);

                amForm.ShowDialog(this);
            }
        }
コード例 #19
0
        public void QueueVoicemailEmail(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, string subject, string message, string attachmentPath)
        {
            VoicemailData vmData = new VoicemailData();

            vmData.Extension      = extension;
            vmData.AttachmentPath = attachmentPath;
            vmData.Message        = message;
            vmData.Subject        = subject;

            vmMailQueue.Enqueue(vmData);
        }
コード例 #20
0
 public ExtensionScriptProcessor(ScriptService scriptService, TelecomScriptInterface onholdTsInterface, WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, VoicemailMailerService vmMailerService, PBXRegistrarService registrarService /*, ExtensionStateService extStateService*/, bool disableCallScreening, bool autoConnect, bool autoAnswer)
 {
     this.autoAnswer        = autoAnswer;
     this.scriptService     = scriptService;
     this.registrarService  = registrarService;
     this.onholdTsInterface = onholdTsInterface;
     this.extension         = extension;
     this.vmMailerService   = vmMailerService;
     //this.extStateService = extStateService;
     this.disableCallScreening = disableCallScreening;
     this.autoConnect          = autoConnect;
 }
コード例 #21
0
        private void DeleteExtension(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension)
        {
            if (MessageBox.Show(this, CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.ExtensionView_ConfirmDelete), CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.Common_ConfirmDelete), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                // Delete the remote extension
                ManagementInterfaceClient.ManagementInterface.DeleteExtension(ManagementInterfaceClient.AuthInfo, extension.ExtensionID);

                // Delete the local copy
                extension.Table.Rows.Remove(extension);
                //extension.Delete();
            }
        }
コード例 #22
0
        public void CreateVoicemail(Guid voicemailID, Guid extensionID, string callerDisplayName, string callerHost, string callerUsername)
        {
            // Get our extension
            WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtension(Properties.Settings.Default.CustomerID, extensionID);

            if (extension != null)
            {
                // Create a new voicemail record
                WOSI.CallButler.Data.CallButlerDataset.VoicemailsDataTable voicemailsTable = new WOSI.CallButler.Data.CallButlerDataset.VoicemailsDataTable();
                WOSI.CallButler.Data.CallButlerDataset.VoicemailsRow       voicemail       = voicemailsTable.NewVoicemailsRow();
                voicemail.CallerDisplayName = callerDisplayName;
                voicemail.CallerHost        = callerHost;
                voicemail.CallerUsername    = callerUsername;
                voicemail.ExtensionID       = extensionID;
                voicemail.VoicemailID       = voicemailID;
                voicemail.Timestamp         = DateTime.Now;
                voicemailsTable.AddVoicemailsRow(voicemail);

                dataProvider.PersistVoicemail(voicemail);

                // Run the voicemail through any VM plugins
                CallButler.Service.Plugin.CallButlerVoicemailHandlerPlugin[] vmHandlers = pluginManager.GetAllPluginsOfType <CallButler.Service.Plugin.CallButlerVoicemailHandlerPlugin>();
                foreach (CallButler.Service.Plugin.CallButlerVoicemailHandlerPlugin vmHandler in vmHandlers)
                {
                    try
                    {
                        vmHandler.OnNewVoicemail(voicemail.CallerDisplayName, voicemail.CallerHost, voicemail.ExtensionID.ToString(), voicemail.VoicemailID.ToString(), WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.VoicemailRootDirectory) + "\\" + voicemail.ExtensionID.ToString() + "\\" + voicemail.VoicemailID.ToString() + ".snd");
                    }
                    catch (Exception e)
                    {
                        LoggingService.AddLogEntry(WOSI.CallButler.ManagementInterface.LogLevel.ErrorsOnly, string.Format("Voicemail Handler Plugin Failed\r\n\r\n{0} ({1})\r\n\r\n{2}", vmHandler.PluginName, vmHandler.PluginID.ToString(), e.Message), true);
                    }
                }

                // Queue our voicemail Email
                vmMailerService.QueueVoicemailEmail(extension, voicemail);

                // Notify the any PBX phones of a new message
                if (registrarService != null)
                {
                    registrarService.SendMessageWaitingNotification(extension.ExtensionNumber);
                }

                // Notify anyone else of the new message
                WOSI.Utilities.EventUtils.FireAsyncEvent(NewVoicemail, this, new VoicemailEventArgs(voicemail));
            }
        }
コード例 #23
0
 void tcpClientManagementDataServer_OnManagementAllowed(object sender, NET.Remoting.Channels.ManagementAllowedEventArgs e)
 {
     try
     {
         int  ext   = Convert.ToInt32(e.Extension);
         bool allow = false;
         WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow row = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, ext);
         if (row != null)
         {
             allow = row.EnableManagement;
         }
         e.ManagementAllowed = allow;
     }
     catch
     {
         e.ManagementAllowed = false;
     }
 }
コード例 #24
0
        private void SendMessageWaitingNotification(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension)
        {
            PBXPresenceInfo[] presenceInfos = GetPresenceInfoForExtension(extension.ExtensionNumber);

            if (presenceInfos != null)
            {
                foreach (PBXPresenceInfo presenceInfo in presenceInfos)
                {
                    if (presenceInfo.Status == PBXPresenceStatus.Online)
                    {
                        // Create our notify message
                        SipRequest request = new SipRequest(SIPMethodType.NOTIFY);

                        SIPURI requestURI = new SIPURI(presenceInfo.AddressOfRecord);

                        request.BranchID   = "z9hG4bK" + Guid.NewGuid().ToString();
                        request.RequestURI = new SIPURI(presenceInfo.AddressOfRecord);
                        request.HeaderFields["To", "t"].FieldValue   = requestURI.ExtendedURIStringWithParameters;
                        request.HeaderFields["From", "f"].FieldValue = requestURI.ExtendedURIStringWithParameters;
                        request.HeaderFields.Add("Event", "message-summary");
                        request.HeaderFields.Add("Content-Type", "application/simple-message-summary");

                        StringBuilder sb = new StringBuilder();

                        int newVoicemailCount   = dataProvider.GetNewVoicemailCount(extension.ExtensionID);
                        int totalVoicemailCount = dataProvider.GetVoicemails(extension.ExtensionID).Count;

                        string vmStatus = "no";

                        if (newVoicemailCount > 0)
                        {
                            vmStatus = "yes";
                        }

                        sb.AppendFormat("Messages-Waiting: {0}\r\n", vmStatus);
                        sb.AppendFormat("Voice-Message: {0}/{1}", newVoicemailCount, totalVoicemailCount);

                        request.MessageBody = sb.ToString();

                        ipClient.SendSipRequest(request, presenceInfo.RemoteAddress, presenceInfo.RemotePort);
                    }
                }
            }
        }
コード例 #25
0
        void DataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            Guid extensionID = ManagementInterfaceClient.ManagementInterface.GetReceptionistExtension(ManagementInterfaceClient.AuthInfo);

            // Select the right receptionist in the view
            foreach (DataGridViewRow row in extensionsView.DataGridView.Rows)
            {
                WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = (WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow)((DataRowView)row.DataBoundItem).Row;

                if (extension.ExtensionID == extensionID)
                {
                    row.SetValues(true);
                }
                else
                {
                    row.SetValues(false);
                }
            }
        }
コード例 #26
0
        public void PlaceScheduleReminderCall(Guid extensionID, OutlookReminder [] reminders)
        {
            try
            {
                // If the transfer is an extension, find the extension
                WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtension(Properties.Settings.Default.CustomerID, extensionID);

                if (extension != null)
                {
                    if (!extension.DoNotDisturb)
                    {
                        int openLineNumber = 0;

                        // Find an open line
                        for (int index = 1; index <= telecomProvider.LineCount; index++)
                        {
                            if (!telecomProvider.IsLineInUse(index))
                            {
                                // Disable the line for incoming calls
                                tsInterfaces[index].Locked = true;
                                openLineNumber             = index;
                                break;
                            }
                        }

                        if (openLineNumber != 0)
                        {
                            // If we get here, we have an open line and we should start processing our schedule reminder
                            tsInterfaces[openLineNumber].ScriptProcessor = new ScheduleReminderScriptProcessor(extension, reminders);
                            tsInterfaces[openLineNumber].ScriptProcessor.StartProcessing(tsInterfaces[openLineNumber], telecomProvider, dataProvider);

                            return;
                        }
                    }
                }
            }
            catch (Exception)
            {
            }
        }
コード例 #27
0
        void telecomProvider_CallFailed(object sender, CallFailureEventArgs e)
        {
            if (e.LineNumber == lineNumber)
            {
                LoggingService.AddLogEntry(LogLevel.Extended, "(Line " + lineNumber + ") Call failed\r\n" + e.ReasonCode + " - " + e.Reason, false);

                imlInterp.SignalCallFailure();

                if (scriptProcessor != null)
                {
                    scriptProcessor.OnCallFailed(telecomProvider, e);
                }

                //UpdateExtensionCall(e.LineNumber, CallStatus.NotOnCall, null, null);
                //UpdateExtensionCallStatus(CallStatus.NotOnCall);

                extension = null;
                callID    = Guid.Empty;

                CheckAvailability();
            }
        }
コード例 #28
0
        void imlInterp_ScriptFinished(object sender, EventArgs e)
        {
            try
            {
                if (telecomProvider.IsLineInUse(lineNumber))
                {
                    telecomProvider.EndCall(lineNumber);
                }
            }
            catch
            {
            }

            // Automatically unlock our line
            Locked = false;

            extension = null;
            callID    = Guid.Empty;

            LoggingService.AddLogEntry(LogLevel.Extended, "(Line " + lineNumber + ") Script finished processing", false);

            CheckAvailability();
        }
コード例 #29
0
        public ExtensionEditorForm(WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable extensions, WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersDataTable extensionContacts, WOSI.CallButler.Data.CallButlerDataset.LocalizedGreetingsRow voicemailGreeting)
        {
            InitializeComponent();

            this.extensions = extensions;
            this.extension = extension;
            this.extensionContacts = extensionContacts;

               CallButler.Manager.Plugin.CallButlerManagementPlugin plugin = PluginManager.GetPluginFromID(new Guid(Properties.Settings.Default.DefaultFindMePluginID));

               if (plugin != null)
               {
               CallButler.Manager.Plugin.CallButlerManagementPluginViewControl c = plugin.GetNewViewControl();
               c.Load(new object[] { extension, extensionContacts, ManagementInterfaceClient.ManagementInterface.TelephoneNumberDescription, true, true, extensions });
               c.Dock = DockStyle.Fill;
               pnlFindMe.Controls.Add(c);
               }
               else
               {
               NoPluginFoundView c = new NoPluginFoundView();
               c.PluginType = "Find me/Follow me plugin";

               c.Dock = DockStyle.Fill;
               pnlFindMe.Controls.Add(c);
               }

            wizard.PageIndex = 0;

            // Update our UI
            numExtNum.Value = extension.ExtensionNumber;
            txtFirstName.Text = extension.FirstName;
            txtLastName.Text = extension.LastName;
            cbEnableSearch.Checked = extension.EnableSearch;
            cbEnableManagement.Checked = extension.EnableManagement;
            cbEmailNotification.Checked = extension.EmailNotification;
            cbAttach.Checked = extension.EmailAttachment;
            txtEmailAddress.Text = extension.EmailAddress;
            cbCallScreening.Checked = extension.EnableCallScreening;
            cbEnableOutbound.Checked = extension.EnableOutboundCalls;

            if (!extension.IsUseConferenceTransferNull())
                cbHandOff.Checked = !extension.UseConferenceTransfer;
            else
                cbHandOff.Checked = true;

            greetingControl.LoadGreeting(voicemailGreeting, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.GreetingsSoundCache));

            if (!extension.IsPasswordNull() && extension.Password.Length > 0)
            {
                txtPassword.Text = blankPassword;
                txtConfirmPassword.Text = blankPassword;
            }

            if (!extension.IsPBXPasswordNull() && extension.PBXPassword.Length > 0)
            {
                txtPBXPassword.Text = blankPassword;
                txtConfirmPBXPassword.Text = blankPassword;
            }

            txtFirstName.Select();

            btnImportOutlook.Enabled = Utilities.ContactManagement.ContactManagerFactory.CreateContactManager(Utilities.ContactManagement.ContactType.Outlook).IsInstalled;

            loading = false;
            greetingControl.LoadVoices(ManagementInterfaceClient.ManagementInterface.GetTTSVoices());

            pgFindme.Enabled = true;
            pnlHandoff.Visible = true;
            pnlPBXPassword.Visible = true;

            Utils.PrivateLabelUtils.ReplaceProductNameControl(this);
        }
コード例 #30
0
 public ScheduleReminderScriptProcessor(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, OutlookReminder [] reminders)
 {
     this.extension = extension;
     this.reminders = reminders;
 }
コード例 #31
0
 public ReceptionistFinderScriptProcessor(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, ScriptService scriptService)
 {
     this.extension = extension;
     this.scriptService = scriptService;
 }
コード例 #32
0
        protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider)
        {
            // Parse out our external event action
            if (Enum.IsDefined(typeof(ExtensionExternalCommands), command))
            {
                ExtensionExternalCommands externalCommand = WOSI.Utilities.EnumUtils<ExtensionExternalCommands>.Parse(command);

                switch (externalCommand)
                {
                    case ExtensionExternalCommands.CALLBUTLERINTERNAL_ForwardCall:
                        {

                            onholdTsInterface.IMLInterpreter.SetLocalVariable("TransferNumber", commandData);
                            onholdTsInterface.IMLInterpreter.SignalExternalEvent(VoicemailExternalEvents.CALLBUTLERINTERNAL_CallForwarded.ToString());

                            break;
                        }
                    case ExtensionExternalCommands.CALLBUTLERINTERNAL_ConfirmingTransfer:
                        {
                            if (disableCallScreening || !extension.EnableCallScreening)
                            {
                                tsInterface.IMLInterpreter.SignalExternalEvent(ExtensionExternalEvents.CALLBUTLERINTERNAL_SkipConfirmation.ToString());
                            }
                            else
                            {
                                tsInterface.IMLInterpreter.SignalEventCallback(eventToken);
                            }

                            break;
                        }
                    case ExtensionExternalCommands.CALLBUTLERINTERNAL_GetNextNumber:
                        {
                            string callerID = onholdTsInterface.IMLInterpreter.CallerDisplayName;
                            string callerNumber = onholdTsInterface.IMLInterpreter.CallerUsername;

                            if (callerID == null || callerID.Length == 0)
                                callerID = "Unknown Caller";

                            if (callerNumber == null || callerNumber.Length == 0)
                                callerNumber = "";

                            // If we have a previous call, end it
                            if (telecomProvider.IsLineInUse(tsInterface.LineNumber))
                            {
                                telecomProvider.EndCall(tsInterface.LineNumber);
                            }
                            else
                            {
                                // Get our extension contact numbers
                                List<WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow> contactNumbers = new List<WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow>((WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow[])dataProvider.GetExtensionContactNumbers(extension.ExtensionID).Select("", "Priority ASC"));

                                if (extensionNumberIndex + 1 >= contactNumbers.Count && parentExtension != null)
                                {
                                    extensionNumberIndex = parentExtensionIndex;
                                    parentExtensionIndex = -1;

                                    extension = parentExtension;
                                    parentExtension = null;

                                    contactNumbers.Clear();
                                    contactNumbers.AddRange((WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow[])dataProvider.GetExtensionContactNumbers(extension.ExtensionID).Select("", "Priority ASC"));
                                }

                                extensionNumberIndex++;

                                List<string> callBlastNumbers = new List<string>();
                                List<string> callBlastProfiles = new List<string>();
                                int callBlastTimeout = Properties.Settings.Default.CallBlastTimeout;

                                while (extensionNumberIndex < contactNumbers.Count)
                                {
                                    WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow contactNumber = contactNumbers[extensionNumberIndex];

                                    // Is the number online?
                                    if (contactNumber.Online)
                                    {
                                        // Does the number have hours?
                                        TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now);

                                        if (!contactNumber.IsHoursOfOperationUTCOffsetNull())
                                            utcOffset = contactNumber.HoursOfOperationUTCOffset;

                                        if (!contactNumber.HasHoursOfOperation || (contactNumber.HasHoursOfOperation && ScriptUtils.IsInHoursOfOperation(contactNumber.HoursOfOperation, utcOffset)))
                                        {
                                            // Check to see if this number is a PBX IP line
                                            if ((contactNumber.CallPBXPhone || (WOSI.CallButler.Data.ExtensionContactNumberType)contactNumber.Type == WOSI.CallButler.Data.ExtensionContactNumberType.IPPhone) && registrarService != null)
                                            {
                                                int extNumber = extension.ExtensionNumber;

                                                // If this was filled in from another extension, we'll need to check the status of that extension
                                                if (contactNumber.ExtensionID != extension.ExtensionID)
                                                {
                                                    WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow tmpExtension = dataProvider.GetExtension(Properties.Settings.Default.CustomerID, contactNumber.ExtensionID);

                                                    if (tmpExtension != null)
                                                        extNumber = tmpExtension.ExtensionNumber;
                                                }

                                                // Check to see if this pbx phone is online
                                                PBXPresenceInfo[] presInfos = registrarService.GetPresenceInfoForExtension(extNumber);

                                                if (presInfos != null && presInfos.Length > 0)
                                                {
                                                    foreach (PBXPresenceInfo presInfo in presInfos)
                                                    {
                                                        if (presInfo.Status == PBXPresenceStatus.Online)
                                                        {
                                                            if (presInfos.Length > 1 || extension.UseCallBlast)
                                                            {
                                                                if (contactNumbers.Count == 1)
                                                                    callBlastTimeout = contactNumber.Timeout;

                                                                string callBlastNumber = string.Format("sip:{0}@{1}:{2}", presInfo.ExtensionNumber, presInfo.RemoteAddress, presInfo.RemotePort);

                                                                if (!callBlastNumbers.Contains(callBlastNumber))
                                                                {
                                                                    callBlastNumbers.Add(callBlastNumber);
                                                                    callBlastProfiles.Add(TelecomScriptInterface.InternalProviderProfileName);
                                                                }
                                                            }
                                                            else
                                                            {
                                                                TryContactNumber(tsInterface, string.Format("sip:{0}@{1}:{2}", presInfo.ExtensionNumber, presInfo.RemoteAddress, presInfo.RemotePort), callerID, callerNumber, TelecomScriptInterface.InternalProviderProfileName, contactNumber.Timeout.ToString(), eventToken);
                                                                return;
                                                            }
                                                        }
                                                    }

                                                    if (!extension.UseCallBlast && callBlastNumbers.Count > 0)
                                                        break;
                                                }
                                            }
                                            else if ((WOSI.CallButler.Data.ExtensionContactNumberType)contactNumber.Type == WOSI.CallButler.Data.ExtensionContactNumberType.TelephoneNumber)
                                            {
                                                if (extension.UseCallBlast)
                                                {
                                                    if (!callBlastNumbers.Contains(contactNumber.ContactNumber))
                                                    {
                                                        callBlastNumbers.Add(contactNumber.ContactNumber);
                                                        callBlastProfiles.Add("");
                                                    }
                                                }
                                                else
                                                {
                                                    TryContactNumber(tsInterface, contactNumber.ContactNumber, callerID, callerNumber, "", contactNumber.Timeout.ToString(), eventToken);
                                                    return;
                                                }
                                            }
                                            else if ((WOSI.CallButler.Data.ExtensionContactNumberType)contactNumber.Type == WOSI.CallButler.Data.ExtensionContactNumberType.Extension && parentExtension == null)
                                            {
                                                try
                                                {
                                                    // Get our new extension
                                                    WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow newExtension = dataProvider.GetExtension(Properties.Settings.Default.CustomerID, new Guid(contactNumber.ContactNumber));

                                                    if (newExtension != null)
                                                    {
                                                        if (extension.UseCallBlast)
                                                        {
                                                            WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow[] newContacts = (WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow[])dataProvider.GetExtensionContactNumbers(newExtension.ExtensionID).Select("Type <> " + (int)WOSI.CallButler.Data.ExtensionContactNumberType.Extension, "Priority ASC");
                                                            contactNumbers.AddRange(newContacts);
                                                        }
                                                        else
                                                        {
                                                            parentExtension = extension;
                                                            parentExtensionIndex = extensionNumberIndex;

                                                            extensionNumberIndex = -1;
                                                            extension = newExtension;

                                                            tsInterface.IMLInterpreter.SignalExternalEvent(ExtensionExternalEvents.CALLBUTLERINTERNAL_GetNextNumber.ToString());
                                                            return;
                                                        }
                                                    }
                                                }
                                                catch
                                                {
                                                }
                                            }
                                        }
                                    }

                                    extensionNumberIndex++;
                                }

                                if (callBlastNumbers.Count > 0)
                                {
                                    TryCallBlast(telecomProvider, tsInterface, callBlastNumbers.ToArray(), callBlastProfiles.ToArray(), callerID, callerNumber, callBlastTimeout.ToString());
                                    return;
                                }
                                else
                                {
                                    tsInterface.IMLInterpreter.SignalExternalEvent(ExtensionExternalEvents.CALLBUTLERINTERNAL_NoMoreNumbers.ToString());
                                }
                            }

                            break;
                        }
                    case ExtensionExternalCommands.CALLBUTLERINTERNAL_SendToVoicemail:
                        {
                            onholdTsInterface.IMLInterpreter.SyncExternalAction -= IMLInterpreter_SyncExternalAction;

                            // Allow this line to answer calls again
                            tsInterface.Locked = false;

                            if (telecomProvider.IsLineInUse(onholdTsInterface.LineNumber))
                            {
                                telecomProvider.SendingToVoicemail(onholdTsInterface.LineNumber);
                            }

                            onholdTsInterface.IMLInterpreter.SignalExternalEvent(VoicemailExternalEvents.CALLBUTLERINTERNAL_ExtensionNotAvailable.ToString());
                            tsInterface.IMLInterpreter.SignalEventCallback(eventToken);

                            break;
                        }
                    case ExtensionExternalCommands.CALLBUTLERINTERNAL_ConnectCalls:
                        {
                            onholdTsInterface.IMLInterpreter.SyncExternalAction -= IMLInterpreter_SyncExternalAction;

                            onholdTsInterface.IMLInterpreter.SignalExternalEvent(ExtensionExternalCommands.CALLBUTLERINTERNAL_ConnectCalls.ToString());

                            // Allow this line to answer calls again
                            tsInterface.Locked = false;

                            if (autoConnect)
                            {
                                if (telecomProvider.IsLineInUse(tsInterface.LineNumber) && telecomProvider.IsLineInUse(onholdTsInterface.LineNumber))
                                {
                                    if (extension.IsUseConferenceTransferNull() || !extension.UseConferenceTransfer /*|| !Licensing.Management.AppPermissions.StatIsPermitted("Handoff")*/)
                                    {
                                        telecomProvider.TransferCallAttended(onholdTsInterface.LineNumber, tsInterface.LineNumber, Properties.Settings.Default.UseBridgedTransfers);
                                        tsInterface.IMLInterpreter.SignalEventCallback(eventToken);
                                    }
                                    else
                                    {
                                        telecomProvider.StopSound(tsInterface.LineNumber);
                                        telecomProvider.StopSound(onholdTsInterface.LineNumber);
                                        int conferenceID = telecomProvider.ConferenceLines(tsInterface.LineNumber, onholdTsInterface.LineNumber);

                                        // Check to see if the person calling is an internal extension
                                        if (onholdTsInterface.Extension != null)
                                        {
                                            onholdTsInterface.ScriptProcessor = new TransferConferenceScriptProcessor(conferenceID, scriptService, tsInterface, registrarService, extension, vmMailerService);
                                        }
                                        else
                                        {
                                            onholdTsInterface.ScriptProcessor = new TransferConferenceParticipantScriptProcessor(conferenceID, tsInterface, extension, vmMailerService);
                                        }

                                        tsInterface.ScriptProcessor = new TransferConferenceScriptProcessor(conferenceID, scriptService, onholdTsInterface, registrarService, extension, vmMailerService);

                                        onholdTsInterface.ScriptProcessor.StartProcessing(onholdTsInterface, telecomProvider, dataProvider);
                                        tsInterface.ScriptProcessor.StartProcessing(tsInterface, telecomProvider, dataProvider);
                                    }
                                }
                                else
                                {
                                    tsInterface.IMLInterpreter.SignalEventCallback(eventToken);
                                }
                            }

                            break;
                        }
                }
            }
        }
コード例 #33
0
        protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider)
        {
            // Parse out our external event action
            if (Enum.IsDefined(typeof(Click2CallExternalCommands), command))
            {
                Click2CallExternalCommands externalCommand = WOSI.Utilities.EnumUtils <Click2CallExternalCommands> .Parse(command);

                switch (externalCommand)
                {
                case Click2CallExternalCommands.CALLBUTLERINTERNAL_ExtensionNotAvailable:

                    // Allow this to answer calls again
                    tsInterface.Locked = false;

                    break;

                case Click2CallExternalCommands.CALLBUTLERINTERNAL_ConnectCalls:

                    // Check to see if this is a call to another extension
                    int  extensionNumber      = 0;
                    bool disableCallScreening = callMakerExtension == null ? false : true;

                    if (int.TryParse(numberToDial, out extensionNumber))
                    {
                        // If we're calling our own extension, send us to the voicemail management menu
                        if (extensionNumber == callMakerExtension.ExtensionNumber)
                        {
                            callMakerInterface.ScriptProcessor = new VoicemailManagementScriptProcessor(callMakerExtension, scriptService.registrarService);
                            callMakerInterface.ScriptProcessor.StartProcessing(callMakerInterface, telecomProvider, dataProvider);

                            // Allow this to answer calls again
                            tsInterface.Locked = false;

                            break;
                        }
                        else
                        {
                            WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, extensionNumber);

                            if (extension != null)
                            {
                                scriptService.TransferToExtension(extensionNumber.ToString(), callMakerInterface, disableCallScreening);

                                // Allow this to answer calls again
                                tsInterface.Locked = false;

                                break;
                            }
                        }
                    }

                    // Send the caller to main menu
                    if (numberToDial == "*")
                    {
                        scriptService.SetupAutoAttendantAnswer(callMakerInterface.LineNumber, callMakerInterface);
                        callMakerInterface.ScriptProcessor.StartProcessing(callMakerInterface, telecomProvider, dataProvider);

                        // Allow this to answer calls again
                        tsInterface.Locked = false;

                        break;
                    }

                    // If we get here, we make an outbound call to an external number
                    if (callMakerExtension != null)
                    {
                        scriptService.MakeOutboundCall(callMakerInterface, numberToDial, string.Format("{0} {1}", callMakerExtension.FirstName, callMakerExtension.LastName), callMakerExtension.ExtensionNumber, false, true);
                    }

                    // Allow this to answer calls again
                    tsInterface.Locked = false;

                    break;
                }

                tsInterface.IMLInterpreter.SignalEventCallback(eventToken);
            }
        }
コード例 #34
0
 public VoicemailManagementScriptProcessor(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, PBXRegistrarService pbxRegistrar)
 {
     this.extension = extension;
     this.pbxRegistrar = pbxRegistrar;
 }
コード例 #35
0
 public ExtensionScriptProcessor(ScriptService scriptService, TelecomScriptInterface onholdTsInterface, WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, VoicemailMailerService vmMailerService, PBXRegistrarService registrarService/*, ExtensionStateService extStateService*/, bool disableCallScreening, bool autoConnect, bool autoAnswer)
 {
     this.autoAnswer = autoAnswer;
     this.scriptService = scriptService;
     this.registrarService = registrarService;
     this.onholdTsInterface = onholdTsInterface;
     this.extension = extension;
     this.vmMailerService = vmMailerService;
     //this.extStateService = extStateService;
     this.disableCallScreening = disableCallScreening;
     this.autoConnect = autoConnect;
 }
コード例 #36
0
        void telecomProvider_IncomingCall(object sender, CallEventArgs e)
        {
            UpdatePerformanceCounters();

            // Add a log entry
            LoggingService.AddLogEntry(LogLevel.Basic, "(Line " + e.LineNumber + ") Incoming call from " + e.CallerDisplayName + " " + e.CallerPhoneNumber + " to " + e.CallingToNumber + " " + e.CallingToMiscInfo, false);

            // Check to see if the service is supposed to be running and that we have a valid license.
            if (/*(LicenseService.IsLicensed() || LicenseService.IsTrialLicense() || Properties.Settings.Default.IsFreeVersion) &&*/ Properties.Settings.Default.ServiceEnabled)
            {
                TelecomScriptInterface tsInterface = tsInterfaces[e.LineNumber];

                // Populate our caller variables into the IML Interpreter so they can be used in our script
                tsInterface.IMLInterpreter.CallerDisplayName = e.CallerDisplayName;
                tsInterface.IMLInterpreter.CallerHost        = e.CallerMiscInfo;
                tsInterface.IMLInterpreter.CallerUsername    = e.CallerPhoneNumber;
                tsInterface.IMLInterpreter.DialedUsername    = e.CallingToNumber;
                tsInterface.IMLInterpreter.DialedHost        = e.CallingToMiscInfo;

                // Set the profile parameter of our tsInterface. This is usually the profile for the incoming call.
                //tsInterface.Profile = e.Tag;

                // Check to see if this caller is asking for a direct extension number
                WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = null;
                tsInterface.Extension = null;
                int internalCallerExtension = 0;

                // Check to see if this is an internal caller
                if (registrarService != null)
                {
                    try
                    {
                        WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow internalExtensionRow = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, Convert.ToInt32(e.CallerPhoneNumber));

                        if (internalExtensionRow != null)
                        {
                            tsInterface.Extension   = internalExtensionRow;
                            internalCallerExtension = internalExtensionRow.ExtensionNumber;

                            // Update our extension status

                            /*if (Properties.Settings.Default.EnableKinesisServer)
                             * {
                             *  tsInterface.UpdateExtensionCallStatus(CallStatus.Dialing);
                             * }*/
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                }

                try
                {
                    int extensionNumber = Convert.ToInt32(e.CallingToNumber);
                    extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, extensionNumber);
                }
                catch
                {
                }

                if (extension != null)
                {
                    // If this extension is calling itself, send it to the voicemail management script, otherwise send it to the extension.
                    if (e.CallerPhoneNumber == e.CallingToNumber)
                    {
                        // Start the voicemail processing script
                        tsInterface.ScriptProcessor = new VoicemailManagementScriptProcessor(extension, registrarService);

                        if (telecomProvider.IsLineInUse(e.LineNumber))
                        {
                            telecomProvider.AnswerCall(e.LineNumber, tsInterface.Extension == null ? false : true);
                        }
                    }
                    else
                    {
                        // Send the caller to the requested extension
                        if (telecomProvider.IsLineInUse(e.LineNumber))
                        {
                            telecomProvider.AnswerCall(e.LineNumber, tsInterface.Extension == null ? false : true);
                        }

                        TransferToExtension(extension.ExtensionNumber.ToString(), tsInterface, true);
                    }

                    return;
                }

                if (tsInterface.Extension != null)
                {
                    // If dialing "*", send the internal caller to the main menu
                    if (e.CallingToNumber == "*" || e.CallingToNumber.Trim() == "")
                    {
                    }
                    // This is an internal caller trying to make an outbound call
                    else if (Properties.Settings.Default.AllowOutboundDialing && e.CallingToNumber.StartsWith(Properties.Settings.Default.OutboundDialingPrefix))
                    {
                        if (MakeOutboundCall(tsInterface, e.CallingToNumber, e.CallerDisplayName, internalCallerExtension, true, false))
                        {
                            telecomProvider.AnswerCall(e.LineNumber, tsInterface.Extension == null ? false : true);

                            return;
                        }
                    }
                }

                // Should we be trying the receptionist first?
                if (Properties.Settings.Default.TryReceptionistFirst)
                {
                    WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow recepExtension = dataProvider.GetExtension(Properties.Settings.Default.CustomerID, Properties.Settings.Default.ReceptionistExtensionID);

                    if (recepExtension != null)
                    {
                        ReceptionistFinderScriptProcessor recepSp = new ReceptionistFinderScriptProcessor(recepExtension, this);
                        TransferToExtension(recepExtension.ExtensionNumber.ToString(), recepSp, tsInterface, true);
                        return;
                    }
                }

                ProcessAutoAttendantAnswer(e.LineNumber, tsInterface, true);
            }
        }
コード例 #37
0
        internal void AddNewExtension()
        {
            // Check to make sure we can add a new extension
            int maxExtensions = 100;

            if (maxExtensions > 0 && maxExtensions <= callButlerDataset.Extensions.Count)
            {
                MessageBox.Show(this, String.Format(CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.ExtensionsView_ExtLimit), maxExtensions), CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.Common_PermissionDenied), MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            // Create a new Extension row
            WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = callButlerDataset.Extensions.NewExtensionsRow();

            extension.CustomerID  = Properties.Settings.Default.CustomerID;
            extension.ExtensionID = Guid.NewGuid();
            short extensionNum = 0;

            // Find us an unused extension number
            for (short index = Properties.Settings.Default.MinExtensionNumber; index < short.MaxValue; index++)
            {
                if (callButlerDataset.Extensions.Select("ExtensionNumber = " + index).Length == 0)
                {
                    extensionNum = index;
                    extension.ExtensionNumber = index;
                    break;
                }
            }

            // Create a new voicemail greeting
            WOSI.CallButler.Data.CallButlerDataset.LocalizedGreetingsDataTable voicemailGreetingTable = new WOSI.CallButler.Data.CallButlerDataset.LocalizedGreetingsDataTable();
            WOSI.CallButler.Data.CallButlerDataset.LocalizedGreetingsRow       voicemailGreeting      = voicemailGreetingTable.NewLocalizedGreetingsRow();
            voicemailGreeting.GreetingID          = extension.ExtensionID;
            voicemailGreeting.LocalizedGreetingID = Guid.NewGuid();
            voicemailGreeting.LanguageID          = ManagementInterfaceClient.ManagementInterface.GetDefaultLanguage(ManagementInterfaceClient.AuthInfo);
            voicemailGreeting.Type = (short)WOSI.CallButler.Data.GreetingType.SoundGreeting;
            voicemailGreetingTable.AddLocalizedGreetingsRow(voicemailGreeting);

            // Create a new extension contact numbers table
            WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersDataTable extensionContactNumbers = new WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersDataTable();

            // Show our extension editor form
            Forms.ExtensionEditorForm extensionForm = new CallButler.Manager.Forms.ExtensionEditorForm(callButlerDataset.Extensions, extension, extensionContactNumbers, voicemailGreeting);

            WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable origExt = (WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable)callButlerDataset.Extensions.Copy();

            if (extensionForm.ShowDialog(this) == DialogResult.OK)
            {
                // Check to make sure the extension isn't already taken
                if (origExt.Select("ExtensionNumber = " + extension.ExtensionNumber).Length > 0)
                {
                    MessageBox.Show(this, String.Format(CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.ExtensionView_ExtTaken), extension.ExtensionNumber, extensionNum), CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.ExtensionView_ExtConflict), MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    extension.ExtensionNumber = extensionNum;
                }

                // Add our local extension
                callButlerDataset.Extensions.AddExtensionsRow(extension);

                // Add our remote extension
                WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable extensionDataTable = Utils.TableUtils <WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable> .CreateTableFromRow(extension);

                ManagementInterfaceClient.ManagementInterface.PersistExtension(ManagementInterfaceClient.AuthInfo, extensionDataTable);

                // Add our voicemail greeting
                ManagementInterfaceClient.ManagementInterface.PersistLocalizedGreeting(ManagementInterfaceClient.AuthInfo, voicemailGreetingTable);

                // Send our voicemail greeting sound file
                Utils.GreetingUtils.PersistLocalizedGreetingSound(voicemailGreeting);

                // Persist our contact numbers
                ManagementInterfaceClient.ManagementInterface.PersistExtensionContactNumbers(ManagementInterfaceClient.AuthInfo, extensionContactNumbers);
            }
        }
コード例 #38
0
        void imlInterp_ScriptFinished(object sender, EventArgs e)
        {
            try
            {
                if (telecomProvider.IsLineInUse(lineNumber))
                    telecomProvider.EndCall(lineNumber);
            }
            catch
            {
            }

            // Automatically unlock our line
            Locked = false;

            extension = null;
            callID = Guid.Empty;

            LoggingService.AddLogEntry(LogLevel.Extended, "(Line " + lineNumber + ") Script finished processing", false);

            CheckAvailability();
        }
コード例 #39
0
        void telecomProvider_CallFailed(object sender, CallFailureEventArgs e)
        {
            if (e.LineNumber == lineNumber)
            {
                LoggingService.AddLogEntry(LogLevel.Extended, "(Line " + lineNumber + ") Call failed\r\n" + e.ReasonCode + " - " + e.Reason, false);

                imlInterp.SignalCallFailure();

                if (scriptProcessor != null)
                    scriptProcessor.OnCallFailed(telecomProvider, e);

                //UpdateExtensionCall(e.LineNumber, CallStatus.NotOnCall, null, null);
                //UpdateExtensionCallStatus(CallStatus.NotOnCall);

                extension = null;
                callID = Guid.Empty;

                CheckAvailability();
            }
        }
コード例 #40
0
        void telecomProvider_CallEnded(object sender, LineEventArgs e)
        {
            if (e.LineNumber == lineNumber)
            {
                try
                {
                    LoggingService.AddLogEntry(LogLevel.Basic, "(Line " + e.LineNumber + ") Call Ended", false);

                    StopSounds(e.LineNumber);

                    // Add a call history item
                    if (Properties.Settings.Default.EnableCallHistory)
                    {
                        WOSI.CallButler.Data.CallButlerDataset.CallHistoryDataTable callHistoryTable = new WOSI.CallButler.Data.CallButlerDataset.CallHistoryDataTable();
                        WOSI.CallButler.Data.CallButlerDataset.CallHistoryRow callHistoryItem = callHistoryTable.NewCallHistoryRow();

                        callHistoryItem.CallDuration = (TimeSpan)(DateTime.Now - callStartTime);
                        callHistoryItem.CallerDisplayName = imlInterp.CallerDisplayName;
                        callHistoryItem.CallerHost = imlInterp.CallerHost;
                        callHistoryItem.CallerUsername = imlInterp.CallerUsername;
                        callHistoryItem.ToUsername = imlInterp.DialedUsername;
                        callHistoryItem.ToHost = imlInterp.DialedHost;
                        callHistoryItem.CallID = Guid.NewGuid();
                        callHistoryItem.CustomerID = Properties.Settings.Default.CustomerID;
                        callHistoryItem.Timestamp = callStartTime;

                        callHistoryTable.AddCallHistoryRow(callHistoryItem);

                        dataProvider.PersistCallHistory(callHistoryItem);
                    }
                }
                catch(Exception ex)
                {
                    LoggingService.AddLogEntry(LogLevel.ErrorsOnly, "(Line " + lineNumber + ") Unable to add a call history entry: " + ex.ToString(), true);
                }

                //UpdateExtensionCall(e.LineNumber, CallStatus.NotOnCall, null, null);
                //UpdateExtensionCallStatus(CallStatus.NotOnCall);

                try
                {
                    if (imlInterp == null)
                    {
                        LoggingService.AddLogEntry(LogLevel.ErrorsOnly, "**** Iml Interpreter is NULL", true);
                    }

                    imlInterp.SignalHangup();
                }
                catch(Exception ex)
                {
                    LoggingService.AddLogEntry(LogLevel.ErrorsOnly, "(Line " + lineNumber + ") Unable to signal the end of a script: " + ex.ToString(), true);
                }

                if (imlInterp.ImlScript == null)
                {
                    // Automatically unlock our line
                    Locked = false;
                }

                callID = Guid.Empty;
                extension = null;

                CheckAvailability();
            }
        }
コード例 #41
0
        private void UpdateDepartmentItem(CallFlowItem departmentItem)
        {
            WOSI.CallButler.Data.CallButlerDataset.DepartmentsRow departmentRow = (WOSI.CallButler.Data.CallButlerDataset.DepartmentsRow)departmentItem.Tag;
            departmentItem.Title = String.Format(CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.CallFlowView_Dial), departmentRow.OptionNumber, departmentRow.Name);

            CallFlowItem subItem = (CallFlowItem)departmentItem.ChildShapes[0];

            subItem.Title   = "";
            subItem.Caption = "";

            switch ((WOSI.CallButler.Data.DepartmentTypes)departmentRow.Type)
            {
            case WOSI.CallButler.Data.DepartmentTypes.Extension:

                // Get our extenstion
                try
                {
                    WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = vbData.Extensions.FindByExtensionID(new Guid(departmentRow.Data1));

                    if (extension != null)
                    {
                        subItem.Icon    = Properties.Resources.telephone_24;
                        subItem.Title   = String.Format(CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.CallFlowView_TransferExt), extension.ExtensionNumber);
                        subItem.Caption = extension.FirstName + " " + extension.LastName;
                    }

                    break;
                }
                catch
                {
                }

                subItem.Icon    = Properties.Resources.telephone_24;
                subItem.Title   = CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.CallFlowView_UnknownExt);
                subItem.Caption = CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.CallFlowView_ExtDeleted);

                break;

            case WOSI.CallButler.Data.DepartmentTypes.Greeting:
                subItem.Title = CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.CallFlowView_PlayGreeting);
                subItem.Icon  = Properties.Resources.call_greeting_24;

                break;

            case WOSI.CallButler.Data.DepartmentTypes.Number:

                subItem.Icon  = Properties.Resources.telephone_24;
                subItem.Title = String.Format(CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.CallFlowView_TransferNum), WOSI.Utilities.StringUtils.FormatPhoneNumber(departmentRow.Data1));

                break;

            case WOSI.CallButler.Data.DepartmentTypes.Script:

                subItem.Icon  = Properties.Resources.scroll_24;
                subItem.Title = CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.CallFlowView_CustomScript);
                break;

            case WOSI.CallButler.Data.DepartmentTypes.Module:

                subItem.Icon  = Properties.Resources.gear_connection_24;
                subItem.Title = CallButler.Manager.Utils.PrivateLabelUtils.ReplaceProductName(Properties.LocalizedStrings.CallFlowView_AddonModule);

                break;
            }
        }
コード例 #42
0
        protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider)
        {
            // Parse out our external event action
            if (Enum.IsDefined(typeof(StandardExternalCommands), command))
            {
                StandardExternalCommands externalCommand = WOSI.Utilities.EnumUtils <StandardExternalCommands> .Parse(command);

                switch (externalCommand)
                {
                case StandardExternalCommands.CALLBUTLERINTERNAL_ChooseLanguage:
                {
                    if (!Properties.Settings.Default.Multilingual)
                    {
                        tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_NotMultilingual.ToString());
                    }
                    else
                    {
                        tsInterface.IMLInterpreter.SignalEventCallback(eventToken);
                    }
                    break;
                }

                case StandardExternalCommands.CALLBUTLERINTERNAL_SetLanguageID:
                {
                    List <string> languages = new List <string>();
                    languages.Add(Properties.Settings.Default.DefaultLanguage);
                    languages.AddRange(Properties.Settings.Default.Languages.Split(';'));

                    int languageNumber = Convert.ToInt32(commandData);

                    if (languageNumber > 0 && languageNumber <= languages.Count)
                    {
                        // Set our language ID variable
                        tsInterface.IMLInterpreter.SetLocalVariable("LanguageID", languages[languageNumber - 1]);
                        tsInterface.IMLInterpreter.SignalEventCallback(eventToken);
                    }
                    else
                    {
                        tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_InvalidLanguage.ToString());
                    }

                    break;
                }

                case StandardExternalCommands.CALLBUTLERINTERNAL_ProcessMainMenuOption:
                {
                    WOSI.CallButler.Data.CallButlerDataset.DepartmentsDataTable departments = dataProvider.GetDepartments(Properties.Settings.Default.CustomerID);

                    WOSI.CallButler.Data.CallButlerDataset.DepartmentsRow[] choosenDepartments = (WOSI.CallButler.Data.CallButlerDataset.DepartmentsRow[])departments.Select("OptionNumber = " + commandData);

                    if (choosenDepartments.Length > 0)
                    {
                        WOSI.CallButler.Data.CallButlerDataset.DepartmentsRow choosenDepartment = choosenDepartments[0];

                        switch (choosenDepartment.Type)
                        {
                        case (short)WOSI.CallButler.Data.DepartmentTypes.Greeting:
                            tsInterface.IMLInterpreter.SetLocalVariable("MainMenuOptionGreetingID", choosenDepartment.DepartmentID.ToString());
                            tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_GreetingMenuOption.ToString());
                            break;

                        case (short)WOSI.CallButler.Data.DepartmentTypes.Extension:

                            // Find our extension number
                            try
                            {
                                WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtension(Properties.Settings.Default.CustomerID, new Guid(choosenDepartment.Data1));

                                if (extension != null)
                                {
                                    tsInterface.IMLInterpreter.SetLocalVariable("Extension", extension.ExtensionNumber.ToString());
                                }
                            }
                            catch
                            {
                            }

                            tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_ExtensionMenuOption.ToString());
                            break;

                        case (short)WOSI.CallButler.Data.DepartmentTypes.Script:
                            tsInterface.IMLInterpreter.SetLocalVariable("CustomScriptPath", choosenDepartment.Data1);
                            tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_ScriptMenuOption.ToString());

                            break;

                        case (short)WOSI.CallButler.Data.DepartmentTypes.Number:
                            tsInterface.IMLInterpreter.SetLocalVariable("TransferToNumber", choosenDepartment.Data1);
                            tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_NumberTransferMenuOption.ToString());

                            break;

                        case (short)WOSI.CallButler.Data.DepartmentTypes.Module:
                            tsInterface.IMLInterpreter.SetLocalVariable("AddonModuleID", choosenDepartment.Data1);
                            tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_AddonModuleMenuOption.ToString());

                            break;
                        }
                    }
                    else
                    {
                        tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_InvalidMenuOption.ToString());
                    }

                    break;
                }

                case StandardExternalCommands.CALLBUTLERINTERNAL_DialByNameSearch:

                    // Find our extensions for this search string
                    WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable extensions = dataProvider.GetExtensions(Properties.Settings.Default.CustomerID);

                    WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow[] matchingExtensions = (WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow[])extensions.Select("SearchNumber LIKE '" + commandData + "*' AND EnableSearch = True");

                    // Get our extension search index
                    int searchIndex = Convert.ToInt32(tsInterface.IMLInterpreter.GetLocalVariable("ExtensionSearchIndex"));
                    searchIndex++;

                    if (matchingExtensions.Length > 0 && searchIndex < matchingExtensions.Length)
                    {
                        tsInterface.IMLInterpreter.SetLocalVariable("Extension", matchingExtensions[searchIndex].ExtensionNumber.ToString());
                        tsInterface.IMLInterpreter.SetLocalVariable("ExtensionName", matchingExtensions[searchIndex].FirstName + " " + matchingExtensions[searchIndex].LastName);
                        tsInterface.IMLInterpreter.SetLocalVariable("ExtensionSearchIndex", searchIndex.ToString());
                    }
                    else
                    {
                        tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_ExtensionNotFound.ToString());
                    }

                    tsInterface.IMLInterpreter.SignalEventCallback(eventToken);

                    break;

                case StandardExternalCommands.CALLBUTLERINTERNAL_VoicemailManagement:
                {
                    try
                    {
                        WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, Convert.ToInt32(tsInterface.IMLInterpreter.GetLocalVariable("Extension")));

                        if (extension != null)
                        {
                            tsInterface.ScriptProcessor = new VoicemailManagementScriptProcessor(extension, pbxRegistrar);
                            tsInterface.ScriptProcessor.StartProcessing(tsInterface, telecomProvider, dataProvider);

                            break;
                        }
                    }
                    catch
                    {
                    }

                    tsInterface.IMLInterpreter.SignalTransferFailure();

                    break;
                }

                    /*case StandardExternalCommands.CALLBUTLERINTERNAL_StartAddonModule:
                     *  {
                     *      CallButler.Service.Plugin.CallButlerAddonModulePlugin[] addonModules = pluginManager.GetAllPluginsOfType<CallButler.Service.Plugin.CallButlerAddonModulePlugin>();
                     *
                     *      foreach (CallButler.Service.Plugin.CallButlerAddonModulePlugin addonModule in addonModules)
                     *      {
                     *          if (addonModule.PluginID.ToString() == commandData)
                     *          {
                     *              try
                     *              {
                     *                  // Make sure the module is licensed
                     *                  if (!addonModule.IsLicensed)
                     *                      break;
                     *
                     *                  // We found our module and we should load the script it uses
                     *                  tsInterface.ScriptProcessor = new AddonModuleScriptProcessor(addonModule);
                     *                  tsInterface.ScriptProcessor.StartProcessing(tsInterface, telecomProvider, dataProvider);
                     *                  return;
                     *
                     *              }
                     *              catch (Exception e)
                     *              {
                     *                  LoggingService.AddLogEntry(WOSI.CallButler.ManagementInterface.LogLevel.ErrorsOnly, "Failed to load Addon-Module '" + addonModule.PluginName + "'\r\n\r\n" + e.Message + "\r\n\r\n" + e.StackTrace, true);
                     *              }
                     *          }
                     *      }
                     *
                     *      tsInterface.ScriptProcessor = this;
                     *      tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_AddonModuleFailed.ToString());
                     *
                     *      break;
                     *  }*/
                }
            }
        }
コード例 #43
0
 public VoicemailManagementScriptProcessor(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, PBXRegistrarService pbxRegistrar)
 {
     this.extension    = extension;
     this.pbxRegistrar = pbxRegistrar;
 }