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; }
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 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 { } }
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); } } }
/*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); }
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); } } }
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; }
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); } }
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; }
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); }
public void SendMessageWaitingNotification(int extensionNumber) { WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, extensionNumber); if (extension != null) { SendMessageWaitingNotification(extension); } }
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"; } }
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(); } }
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); } }
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); }
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; }
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(); } }
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)); } }
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; } }
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); } } } }
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); } } }
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) { } }
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(); } }
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(); }
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); }
public ScheduleReminderScriptProcessor(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, OutlookReminder [] reminders) { this.extension = extension; this.reminders = reminders; }
public ReceptionistFinderScriptProcessor(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, ScriptService scriptService) { this.extension = extension; this.scriptService = scriptService; }
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; } } } }
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); } }
public VoicemailManagementScriptProcessor(WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension, PBXRegistrarService pbxRegistrar) { this.extension = extension; this.pbxRegistrar = pbxRegistrar; }
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; }
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); } }
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); } }
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(); }
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(); } }
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(); } }
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; } }
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; * }*/ } } }