Phonebook results successfully converted to flat list and printed to console for Root, folder contents and search results

This commit is contained in:
Neil Dorin
2017-09-27 12:23:32 -06:00
parent 68427af337
commit 12683551a4
3 changed files with 136 additions and 44 deletions

View File

@@ -15,16 +15,16 @@ namespace PepperDash.Essentials.Devices.Common.Codec
void SearchDirectory(string searchString); void SearchDirectory(string searchString);
void GetFolderContents(string folderId); void GetDirectoryFolderContents(string folderId);
} }
public class CodecDirectory public class CodecDirectory
{ {
public List<DirectoryItem> DirectoryResults { get; private set; } public List<DirectoryItem> DirectoryResults { get; private set; }
public int Offset { get; private set; } //public int Offset { get; private set; }
public int Limit { get; private set; } //public int Limit { get; private set; }
public CodecDirectory() public CodecDirectory()
{ {
@@ -79,12 +79,11 @@ namespace PepperDash.Essentials.Devices.Common.Codec
{ {
public List<DirectoryContact> Contacts { get; set; } public List<DirectoryContact> Contacts { get; set; }
public string FolderId { get; set; } public string FolderId { get; set; }
public DirectoryFolder ParentFolder { get; set; } public string ParentFolderId { get; set; }
public DirectoryFolder() public DirectoryFolder()
{ {
Contacts = new List<DirectoryContact>(); Contacts = new List<DirectoryContact>();
ParentFolder = new DirectoryFolder();
} }
} }
@@ -94,6 +93,11 @@ namespace PepperDash.Essentials.Devices.Common.Codec
public string FolderId { get; set; } public string FolderId { get; set; }
public string Title { get; set; } public string Title { get; set; }
public List<ContactMethod> ContactMethods { get; set; } public List<ContactMethod> ContactMethods { get; set; }
public DirectoryContact()
{
ContactMethods = new List<ContactMethod>();
}
} }
public class ContactMethod public class ContactMethod

View File

@@ -162,6 +162,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
int PhonebookResultsLimit = 255; // Could be set later by config. int PhonebookResultsLimit = 255; // Could be set later by config.
CTimer LoginMessageReceived;
// Constructor for IBasicCommunication // Constructor for IBasicCommunication
public CiscoCodec(string key, string name, IBasicCommunication comm, CiscoCodecPropertiesConfig props ) public CiscoCodec(string key, string name, IBasicCommunication comm, CiscoCodecPropertiesConfig props )
: base(key, name) : base(key, name)
@@ -173,6 +175,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
Communication = comm; Communication = comm;
LoginMessageReceived = new CTimer(DisconnectClientAndReconnect, 5000);
if (props.CommunicationMonitorProperties != null) if (props.CommunicationMonitorProperties != null)
{ {
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, props.CommunicationMonitorProperties); CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, props.CommunicationMonitorProperties);
@@ -228,7 +232,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
{ {
CrestronConsole.AddNewConsoleCommand(SendText, "send" + Key, "", ConsoleAccessLevelEnum.AccessOperator); CrestronConsole.AddNewConsoleCommand(SendText, "send" + Key, "", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(SetCommDebug, "SetCiscoCommDebug", "0 for Off, 1 for on", ConsoleAccessLevelEnum.AccessOperator); CrestronConsole.AddNewConsoleCommand(SetCommDebug, "SetCiscoCommDebug", "0 for Off, 1 for on", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(GetPhonebook, "GetCodecPhonebook", "Triggers a refresh of the codec phonebook", ConsoleAccessLevelEnum.AccessOperator);
CommDebuggingIsOn = true;
Communication.Connect(); Communication.Connect();
var socket = Communication as ISocketStatus; var socket = Communication as ISocketStatus;
if (socket != null) if (socket != null)
@@ -265,12 +271,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
/// <param name="e"></param> /// <param name="e"></param>
void SyncState_InitialSyncCompleted(object sender, EventArgs e) void SyncState_InitialSyncCompleted(object sender, EventArgs e)
{ {
CommDebuggingIsOn = false;
GetCallHistory(); GetCallHistory();
// Get bookings for the day // Get bookings for the day
//SendText("xCommand Bookings List Days: 1 DayOffset: 0"); //SendText("xCommand Bookings List Days: 1 DayOffset: 0");
GetPhonebookFolders(); GetPhonebook(null);
} }
public void SetCommDebug(string s) public void SetCommDebug(string s)
@@ -289,13 +297,28 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs e) void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs e)
{ {
if (!e.Client.IsConnected) if (e.Client.IsConnected)
{
//LoginMessageReceived.Reset();
}
else
{ {
SyncState.CodecDisconnected(); SyncState.CodecDisconnected();
PhonebookSyncState.CodecDisconnected(); PhonebookSyncState.CodecDisconnected();
} }
} }
void DisconnectClientAndReconnect(object o)
{
Debug.Console(0, this, "Disconnecting and Reconnecting to codec.");
Communication.Disconnect();
CrestronEnvironment.Sleep(2000);
Communication.Connect();
}
/// <summary> /// <summary>
/// Gathers responses from the codec (including the delimiter. Responses are checked to see if they contain JSON data and if so, the data is collected until a complete JSON /// Gathers responses from the codec (including the delimiter. Responses are checked to see if they contain JSON data and if so, the data is collected until a complete JSON
/// message is received before forwarding the message to be deserialized. /// message is received before forwarding the message to be deserialized.
@@ -347,6 +370,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
{ {
case "*r login successful": case "*r login successful":
{ {
//LoginMessageReceived.Stop();
SendText("xPreferences outputmode json"); SendText("xPreferences outputmode json");
break; break;
} }
@@ -514,18 +538,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
} }
else if (response.IndexOf("\"PhonebookSearchResult\":{") > -1) else if (response.IndexOf("\"PhonebookSearchResult\":{") > -1)
{ {
var codecPhonebook = new CiscoCodecPhonebook.RootObject(); var codecPhonebookResponse = new CiscoCodecPhonebook.RootObject();
if (!PhonebookSyncState.InitialPhonebookMessageWasReceived) JsonConvert.PopulateObject(response, codecPhonebookResponse);
if (!PhonebookSyncState.InitialPhonebookFoldersWasReceived)
{ {
// Check if the phonebook has any folders // Check if the phonebook has any folders
PhonebookSyncState.InitialPhonebookMessageReceived(); PhonebookSyncState.InitialPhonebookFoldersReceived();
PhonebookSyncState.SetPhonebookHasFolders(codecPhonebook.CommandResponse.PhonebookSearchResult.Folder.Count > 0); PhonebookSyncState.SetPhonebookHasFolders(codecPhonebookResponse.CommandResponse.PhonebookSearchResult.Folder.Count > 0);
if (PhonebookSyncState.PhonebookHasFolders) if (PhonebookSyncState.PhonebookHasFolders)
{ {
DirectoryRoot.AddFoldersToDirectory(CiscoCodecPhonebook.GetRootFoldersFromSearchResult(codecPhonebook.CommandResponse.PhonebookSearchResult)); DirectoryRoot.AddFoldersToDirectory(CiscoCodecPhonebook.GetRootFoldersFromSearchResult(codecPhonebookResponse.CommandResponse.PhonebookSearchResult));
} }
// Get the number of contacts in the phonebook // Get the number of contacts in the phonebook
@@ -534,18 +560,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
else if (!PhonebookSyncState.NumberOfContactsWasReceived) else if (!PhonebookSyncState.NumberOfContactsWasReceived)
{ {
// Store the total number of contacts in the phonebook // Store the total number of contacts in the phonebook
PhonebookSyncState.SetNumberOfContacts(Int32.Parse(codecPhonebook.CommandResponse.PhonebookSearchResult.ResultInfo.TotalRows.Value)); PhonebookSyncState.SetNumberOfContacts(Int32.Parse(codecPhonebookResponse.CommandResponse.PhonebookSearchResult.ResultInfo.TotalRows.Value));
DirectoryRoot.AddContactsToDirectory(CiscoCodecPhonebook.GetRootContactsFromSearchResult(codecPhonebook.CommandResponse.PhonebookSearchResult)); DirectoryRoot.AddContactsToDirectory(CiscoCodecPhonebook.GetRootContactsFromSearchResult(codecPhonebookResponse.CommandResponse.PhonebookSearchResult));
PhonebookSyncState.PhonebookRootEntriesReceived();
PrintPhonebook(DirectoryRoot);
} }
else if (PhonebookSyncState.InitialSyncComplete) else if (PhonebookSyncState.InitialSyncComplete)
{ {
JsonConvert.PopulateObject(response, codecPhonebook); var directoryResults = new CodecDirectory();
if (Debug.Level > 1) directoryResults = CiscoCodecPhonebook.ConvertCiscoPhonebookToGeneric(codecPhonebookResponse.CommandResponse.PhonebookSearchResult);
{
//Print phonebook contents PrintPhonebook(directoryResults);
}
// Fire some sort of callback delegate to the UI that requested the directory search results // Fire some sort of callback delegate to the UI that requested the directory search results
} }
@@ -620,6 +649,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
SendText("xCommand CallHistory Recents Limit: 20 Order: OccurrenceTime"); SendText("xCommand CallHistory Recents Limit: 20 Order: OccurrenceTime");
} }
/// <summary>
/// Triggers a refresh of the codec phonebook
/// </summary>
/// <param name="command">Just to allow this method to be called from a console command</param>
public void GetPhonebook(string command)
{
PhonebookSyncState.CodecDisconnected();
GetPhonebookFolders();
}
private void GetPhonebookFolders() private void GetPhonebookFolders()
{ {
// Get Phonebook Folders (determine local/corporate from config, and set results limit) // Get Phonebook Folders (determine local/corporate from config, and set results limit)
@@ -638,16 +678,36 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
/// <param name="searchString"></param> /// <param name="searchString"></param>
public void SearchDirectory(string searchString) public void SearchDirectory(string searchString)
{ {
SendText(string.Format("xCommand Phonebook Search SearchString: \"{0}\" PhonebookType: {1} ContactType: Contact, Limit: {2}", searchString, PhonebookMode, PhonebookResultsLimit)); SendText(string.Format("xCommand Phonebook Search SearchString: \"{0}\" PhonebookType: {1} ContactType: Contact Limit: {2}", searchString, PhonebookMode, PhonebookResultsLimit));
} }
/// <summary> /// <summary>
/// // Get contents of a specific folder in the phonebook /// // Get contents of a specific folder in the phonebook
/// </summary> /// </summary>
/// <param name="folderId"></param> /// <param name="folderId"></param>
public void GetFolderContents(string folderId) public void GetDirectoryFolderContents(string folderId)
{ {
SendText(string.Format("xCommand Phonebook Search FolderId: {0} PhonebookType: {1} ContactType: Contact, Limit: {2}", folderId, PhonebookMode, PhonebookResultsLimit)); SendText(string.Format("xCommand Phonebook Search FolderId: {0} PhonebookType: {1} ContactType: Contact Limit: {2}", folderId, PhonebookMode, PhonebookResultsLimit));
}
void PrintPhonebook(CodecDirectory directory)
{
if (Debug.Level > 0)
{
Debug.Console(1, this, "Directory Results:\n");
foreach (DirectoryItem item in directory.DirectoryResults)
{
if (item is DirectoryFolder)
{
Debug.Console(1, this, "+ {0}", item.Name);
}
else if (item is DirectoryContact)
{
Debug.Console(1, this, "{0}", item.Name);
}
}
}
} }
public override void Dial(string s) public override void Dial(string s)
@@ -929,11 +989,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
} }
} }
public bool InitialPhonebookFoldersWasReceived { get; private set; }
public bool InitialPhonebookMessageWasReceived { get; private set; }
public bool NumberOfContactsWasReceived { get; private set; } public bool NumberOfContactsWasReceived { get; private set; }
public bool PhonebookRootEntriesWasRecieved { get; private set; }
public bool PhonebookHasFolders { get; private set; } public bool PhonebookHasFolders { get; private set; }
public int NumberOfContacts { get; private set; } public int NumberOfContacts { get; private set; }
@@ -945,9 +1006,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
CodecDisconnected(); CodecDisconnected();
} }
public void InitialPhonebookMessageReceived() public void InitialPhonebookFoldersReceived()
{ {
InitialPhonebookMessageWasReceived = true; InitialPhonebookFoldersWasReceived = true;
CheckSyncStatus();
}
public void PhonebookRootEntriesReceived()
{
PhonebookRootEntriesWasRecieved = true;
CheckSyncStatus();
} }
public void SetPhonebookHasFolders(bool value) public void SetPhonebookHasFolders(bool value)
@@ -963,15 +1033,27 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
NumberOfContactsWasReceived = true; NumberOfContactsWasReceived = true;
Debug.Console(1, this, "Phonebook contains {0} contacts.", NumberOfContacts); Debug.Console(1, this, "Phonebook contains {0} contacts.", NumberOfContacts);
CheckSyncStatus();
} }
public void CodecDisconnected() public void CodecDisconnected()
{ {
InitialPhonebookMessageWasReceived = false; InitialPhonebookFoldersWasReceived = false;
PhonebookHasFolders = false; PhonebookHasFolders = false;
NumberOfContacts = 0; NumberOfContacts = 0;
NumberOfContactsWasReceived = false; NumberOfContactsWasReceived = false;
} }
void CheckSyncStatus()
{
if (InitialPhonebookFoldersWasReceived && NumberOfContactsWasReceived && PhonebookRootEntriesWasRecieved)
{
InitialSyncComplete = true;
Debug.Console(1, this, "Initial Phonebook Sync Complete!");
}
else
InitialSyncComplete = false;
}
} }
} }

View File

@@ -157,13 +157,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
{ {
var rootFolders = new List<DirectoryItem>(); var rootFolders = new List<DirectoryItem>();
if (result.Folder.Count > 0) if (result.Folder.Count == 0)
{ {
return null; return null;
} }
else if (result.Folder.Count > 0) else if (result.Folder.Count > 0)
{ {
if (Debug.Level > 1) if (Debug.Level > 0)
Debug.Console(1, "Phonebook Folders:\n"); Debug.Console(1, "Phonebook Folders:\n");
foreach (Folder f in result.Folder) foreach (Folder f in result.Folder)
@@ -176,7 +176,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
if (f.ParentFolderId == null) if (f.ParentFolderId == null)
rootFolders.Add(folder); rootFolders.Add(folder);
if (Debug.Level > 1) if (Debug.Level > 0)
Debug.Console(1, "+ {0}", folder.Name); Debug.Console(1, "+ {0}", folder.Name);
} }
} }
@@ -187,6 +187,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
} }
/// <summary>
/// Extracts the contacts with no FolderId and returns them sorted alphabetically
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
public static List<DirectoryItem> GetRootContactsFromSearchResult(PhonebookSearchResult result) public static List<DirectoryItem> GetRootContactsFromSearchResult(PhonebookSearchResult result)
{ {
var rootContacts = new List<DirectoryItem>(); var rootContacts = new List<DirectoryItem>();
@@ -197,22 +202,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
} }
else if (result.Contact.Count > 0) else if (result.Contact.Count > 0)
{ {
if (Debug.Level > 1) if (Debug.Level > 0)
Debug.Console(1, "Root Contacts:\n"); Debug.Console(1, "Root Contacts:\n");
foreach (Contact c in result.Contact) foreach (Contact c in result.Contact)
{ {
var contact = new DirectoryContact(); var contact = new DirectoryContact();
if (c.FolderId == null) if (c.FolderId == null)
{ {
contact.Name = c.Name.Value; contact.Name = c.Name.Value;
contact.ContactId = c.ContactId.Value; contact.ContactId = c.ContactId.Value;
contact.Title = c.Title.Value; contact.Title = c.Title.Value;
contact.FolderId = c.FolderId.Value;
if (Debug.Level == 1) if (Debug.Level > 0)
Debug.Console(1, "{0}\nContact Methods:", contact.Name); Debug.Console(1, "{0}\nContact Methods:", contact.Name);
foreach (ContactMethod m in c.ContactMethod) foreach (ContactMethod m in c.ContactMethod)
@@ -237,7 +240,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
else if (m.Device.Value.ToLower() == "other") else if (m.Device.Value.ToLower() == "other")
device = eContactMethodDevice.Other; device = eContactMethodDevice.Other;
if (Debug.Level > 1) if (Debug.Level > 0)
Debug.Console(1, "Number: {0} CallType: {1} Device: {2}", m.Number.Value, callType, device); Debug.Console(1, "Number: {0} CallType: {1} Device: {2}", m.Number.Value, callType, device);
contact.ContactMethods.Add(new PepperDash.Essentials.Devices.Common.Codec.ContactMethod() contact.ContactMethods.Add(new PepperDash.Essentials.Devices.Common.Codec.ContactMethod()
@@ -248,12 +251,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
Device = device Device = device
}); });
} }
rootContacts.Add(contact); rootContacts.Add(contact);
} }
if (Debug.Level == 1)
Debug.Console(1, "{0}", contact.Name);
} }
} }
@@ -274,9 +273,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
#warning Modify this to return a flat list of mixed folders/contacts #warning Modify this to return a flat list of mixed folders/contacts
var directory = new Codec.CodecDirectory(); var directory = new Codec.CodecDirectory();
var folders = new List<Codec.DirectoryFolder>(); var folders = new List<Codec.DirectoryItem>();
var contacts = new List<Codec.DirectoryContact>(); var contacts = new List<Codec.DirectoryItem>();
if (result.Folder.Count > 0) if (result.Folder.Count > 0)
{ {
@@ -290,11 +289,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
if (f.ParentFolderId != null) if (f.ParentFolderId != null)
{ {
// //
folder.ParentFolder = folders.FirstOrDefault(fld => fld.FolderId.Equals(f.ParentFolderId.Value)); folder.ParentFolderId = f.ParentFolderId.Value;
} }
folders.Add(folder); folders.Add(folder);
} }
folders.OrderBy(f => f.Name);
directory.AddFoldersToDirectory(folders);
} }
if (result.Contact.Count > 0) if (result.Contact.Count > 0)
@@ -343,9 +346,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
Device = device Device = device
}); });
} }
//directory.Contacts.Add(contact); contacts.Add(contact);
} }
contacts.OrderBy(c => c.Name);
directory.AddContactsToDirectory(contacts);
} }
return directory; return directory;