mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-01-28 20:04:56 +00:00
1184 lines
38 KiB
C#
1184 lines
38 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.ComponentModel;
|
|
using System.Runtime.CompilerServices;
|
|
using Crestron.SimplSharp;
|
|
|
|
using PepperDash.Core;
|
|
using PepperDash.Essentials.Devices.Common.Codec;
|
|
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|
{
|
|
public enum eZoomRoomResponseType
|
|
{
|
|
zEvent,
|
|
zStatus,
|
|
zConfiguration,
|
|
zCommand
|
|
}
|
|
|
|
public abstract class NotifiableObject : INotifyPropertyChanged
|
|
{
|
|
#region INotifyPropertyChanged Members
|
|
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
|
|
protected void NotifyPropertyChanged(string propertyName)
|
|
{
|
|
if (PropertyChanged != null)
|
|
{
|
|
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|
|
/// <summary>
|
|
/// Used to track the current status of a ZoomRoom
|
|
/// </summary>
|
|
public class ZoomRoomStatus
|
|
{
|
|
public zStatus.Login Login { get; set; }
|
|
public zStatus.SystemUnit SystemUnit { get; set; }
|
|
public zStatus.Phonebook Phonebook { get; set; }
|
|
public zStatus.Call Call { get; set; }
|
|
public zStatus.Capabilities Capabilities { get; set; }
|
|
public zStatus.Sharing Sharing { get; set; }
|
|
public zStatus.NumberOfScreens NumberOfScreens { get; set; }
|
|
public zStatus.Layout Layout { get; set; }
|
|
public zStatus.Video Video { get; set; }
|
|
public zStatus.CameraShare CameraShare { get; set; }
|
|
public List<zStatus.AudioVideoInputOutputLineItem> AudioInputs { get; set; }
|
|
public List<zStatus.AudioVideoInputOutputLineItem> AudioOuputs { get; set; }
|
|
public List<zStatus.AudioVideoInputOutputLineItem> Cameras { get; set; }
|
|
|
|
public ZoomRoomStatus()
|
|
{
|
|
Login = new zStatus.Login();
|
|
SystemUnit = new zStatus.SystemUnit();
|
|
Phonebook = new zStatus.Phonebook();
|
|
Call = new zStatus.Call();
|
|
Capabilities = new zStatus.Capabilities();
|
|
Sharing = new zStatus.Sharing();
|
|
NumberOfScreens = new zStatus.NumberOfScreens();
|
|
Layout = new zStatus.Layout();
|
|
Video = new zStatus.Video();
|
|
CameraShare = new zStatus.CameraShare();
|
|
AudioInputs = new List<zStatus.AudioVideoInputOutputLineItem>();
|
|
AudioOuputs = new List<zStatus.AudioVideoInputOutputLineItem>();
|
|
Cameras = new List<zStatus.AudioVideoInputOutputLineItem>();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Used to track the current configuration of a ZoomRoom
|
|
/// </summary>
|
|
public class ZoomRoomConfiguration
|
|
{
|
|
public zConfiguration.Call Call { get; set; }
|
|
public zConfiguration.Audio Audio { get; set; }
|
|
public zConfiguration.Video Video { get; set; }
|
|
public zConfiguration.Client Client { get; set; }
|
|
|
|
public ZoomRoomConfiguration()
|
|
{
|
|
Call = new zConfiguration.Call();
|
|
Audio = new zConfiguration.Audio();
|
|
Video = new zConfiguration.Video();
|
|
Client = new zConfiguration.Client();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Represents a response from a ZoomRoom system
|
|
/// </summary>
|
|
public class Response
|
|
{
|
|
public Status Status { get; set; }
|
|
public bool Sync { get; set; }
|
|
[JsonProperty("topKey")]
|
|
public string TopKey { get; set; }
|
|
[JsonProperty("type")]
|
|
public string Type { get; set; }
|
|
|
|
public Response()
|
|
{
|
|
Status = new Status();
|
|
}
|
|
}
|
|
|
|
public class Status
|
|
{
|
|
[JsonProperty("message")]
|
|
public string Message { get; set; }
|
|
[JsonProperty("state")]
|
|
public string State { get; set; }
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// zStatus class stucture
|
|
/// </summary>
|
|
public class zStatus
|
|
{
|
|
public class Login
|
|
{
|
|
[JsonProperty("ZAAPI Release")]
|
|
public string ZAAPIRelease { get; set; }
|
|
[JsonProperty("Zoom Room Release")]
|
|
public string ZoomRoomRelease { get; set; }
|
|
}
|
|
|
|
public class SystemUnit
|
|
{
|
|
[JsonProperty("email")]
|
|
public string Email { get; set; }
|
|
[JsonProperty("login_type")]
|
|
public string LoginType { get; set; }
|
|
[JsonProperty("meeting_number")]
|
|
public string MeetingNumber { get; set; }
|
|
[JsonProperty("platform")]
|
|
public string Platform { get; set; }
|
|
[JsonProperty("room_info")]
|
|
public RoomInfo RoomInfo { get; set; }
|
|
[JsonProperty("room_version")]
|
|
public string RoomVersion { get; set; }
|
|
|
|
public SystemUnit()
|
|
{
|
|
RoomInfo = new RoomInfo();
|
|
}
|
|
}
|
|
|
|
public class RoomInfo
|
|
{
|
|
[JsonProperty("account_email")]
|
|
public string AccountEmail { get; set; }
|
|
[JsonProperty("display_version")]
|
|
public string DisplayVersion { get; set; }
|
|
[JsonProperty("is_auto_answer_enabled")]
|
|
public bool AutoAnswerIsEnabled { get; set; }
|
|
[JsonProperty("is_auto_answer_selected")]
|
|
public bool AutoAnswerIsSelected { get; set; }
|
|
[JsonProperty("room_name")]
|
|
public string RoomName { get; set; }
|
|
}
|
|
|
|
public class CloudPbxInfo
|
|
{
|
|
[JsonProperty("company_number")]
|
|
public string CompanyNumber { get; set; }
|
|
[JsonProperty("extension")]
|
|
public string Extension { get; set; }
|
|
[JsonProperty("isValid")]
|
|
public bool IsValid { get; set; }
|
|
}
|
|
|
|
public enum ePresence
|
|
{
|
|
PRESENCE_OFFLINE,
|
|
PRESENCE_ONLINE,
|
|
PRESENCE_AWAY,
|
|
PRESENCE_BUSY,
|
|
PRESENCE_DND
|
|
}
|
|
|
|
public class Contact
|
|
{
|
|
[JsonProperty("avatarURL")]
|
|
public string AvatarURL { get; set; }
|
|
[JsonProperty("cloud_pbx_info")]
|
|
public CloudPbxInfo CloudPbxInfo { get; set; }
|
|
[JsonProperty("email")]
|
|
public string Email { get; set; }
|
|
[JsonProperty("firstName")]
|
|
public string FirstName { get; set; }
|
|
[JsonProperty("index")]
|
|
public int Index { get; set; }
|
|
[JsonProperty("isLegacy")]
|
|
public bool IsLegacy { get; set; }
|
|
[JsonProperty("isZoomRoom")]
|
|
public bool IsZoomRoom { get; set; }
|
|
[JsonProperty("jid")]
|
|
public string Jid { get; set; }
|
|
[JsonProperty("lastName")]
|
|
public string LastName { get; set; }
|
|
[JsonProperty("onDesktop")]
|
|
public bool OnDesktop { get; set; }
|
|
[JsonProperty("onMobile")]
|
|
public bool OnMobile { get; set; }
|
|
[JsonProperty("phoneNumber")]
|
|
public string PhoneNumber { get; set; }
|
|
[JsonProperty("presence")]
|
|
public ePresence Presence { get; set; }
|
|
[JsonProperty("presence_status")]
|
|
public int PresenceStatus { get; set; }
|
|
[JsonProperty("screenName")]
|
|
public string ScreenName { get; set; }
|
|
[JsonProperty("sip_phone_number")]
|
|
public string SipPhoneNumber { get; set; }
|
|
|
|
|
|
public Contact()
|
|
{
|
|
CloudPbxInfo = new CloudPbxInfo();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Used to be able to inplement IInvitableContact on DirectoryContact
|
|
/// </summary>
|
|
public class ZoomDirectoryContact : DirectoryContact, IInvitableContact
|
|
{
|
|
|
|
}
|
|
|
|
public class Phonebook
|
|
{
|
|
[JsonProperty("Contacts")]
|
|
public List<Contact> Contacts { get; set; }
|
|
|
|
public Phonebook()
|
|
{
|
|
Contacts = new List<Contact>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Converts from zStatus.Contact types to generic directory items
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static CodecDirectory ConvertZoomContactsToGeneric(List<Contact> zoomContacts)
|
|
{
|
|
var directory = new Codec.CodecDirectory();
|
|
|
|
var folders = new List<Codec.DirectoryItem>();
|
|
|
|
var roomFolder = new DirectoryFolder();
|
|
|
|
var contactFolder = new DirectoryFolder();
|
|
|
|
var contacts = new List<DirectoryItem>();
|
|
|
|
// Check if there are any zoom rooms
|
|
var zoomRooms = zoomContacts.FindAll(c => c.IsZoomRoom);
|
|
|
|
if (zoomRooms.Count > 0)
|
|
{
|
|
// If so, setup a rooms and contacts folder and add them.
|
|
roomFolder.Name = "Rooms";
|
|
roomFolder.FolderId = "rooms";
|
|
|
|
contactFolder.Name = "Contacts";
|
|
contactFolder.FolderId = "contacts";
|
|
|
|
folders.Add(roomFolder);
|
|
folders.Add(contactFolder);
|
|
|
|
directory.AddFoldersToDirectory(folders);
|
|
}
|
|
|
|
try
|
|
{
|
|
if (zoomContacts.Count > 0)
|
|
{
|
|
foreach (Contact c in zoomContacts)
|
|
{
|
|
var contact = new ZoomDirectoryContact();
|
|
|
|
contact.Name = c.ScreenName;
|
|
contact.ContactId = c.Jid;
|
|
|
|
if (folders.Count > 0)
|
|
{
|
|
if (c.IsZoomRoom)
|
|
contact.FolderId = roomFolder.FolderId;
|
|
else
|
|
contact.FolderId = contactFolder.FolderId;
|
|
}
|
|
|
|
contacts.Add(contact);
|
|
}
|
|
|
|
directory.AddContactsToDirectory(contacts);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Debug.Console(1, "Error converting Zoom Phonebook results to generic: {0}", e);
|
|
}
|
|
|
|
return directory;
|
|
}
|
|
}
|
|
|
|
public enum eCallStatus
|
|
{
|
|
UNKNOWN,
|
|
NOT_IN_MEETING,
|
|
CONNECTING_MEETING,
|
|
IN_MEETING,
|
|
LOGGED_OUT
|
|
}
|
|
|
|
public class ClosedCaption
|
|
{
|
|
public bool Available { get; set; }
|
|
}
|
|
|
|
public class Call : NotifiableObject
|
|
{
|
|
private eCallStatus _status;
|
|
private List<zCommand.ListParticipant> _participants;
|
|
|
|
public bool IsInCall;
|
|
|
|
public eCallStatus Status
|
|
{
|
|
get
|
|
{
|
|
return _status;
|
|
}
|
|
set
|
|
{
|
|
if (value != _status)
|
|
{
|
|
_status = value;
|
|
IsInCall = _status == eCallStatus.IN_MEETING || _status == eCallStatus.CONNECTING_MEETING;
|
|
NotifyPropertyChanged("Status");
|
|
}
|
|
}
|
|
}
|
|
public ClosedCaption ClosedCaption { get; set; }
|
|
public List<zCommand.ListParticipant> Participants
|
|
{
|
|
get
|
|
{
|
|
return _participants;
|
|
}
|
|
set
|
|
{
|
|
_participants = value;
|
|
NotifyPropertyChanged("Participants");
|
|
}
|
|
}
|
|
public zEvent.SharingState Sharing { get; set; }
|
|
|
|
public CallRecordInfo CallRecordInfo { get; set; }
|
|
|
|
public zCommand.InfoResult Info { get; set; }
|
|
|
|
public Call()
|
|
{
|
|
ClosedCaption = new ClosedCaption();
|
|
Participants = new List<zCommand.ListParticipant>();
|
|
Sharing = new zEvent.SharingState();
|
|
CallRecordInfo = new CallRecordInfo();
|
|
Info = new zCommand.InfoResult();
|
|
}
|
|
}
|
|
|
|
public class Capabilities
|
|
{
|
|
public bool aec_Setting_Stored_In_ZR { get; set; }
|
|
public bool can_Dtmf_For_Invite_By_Phone { get; set; }
|
|
public bool can_Mute_On_Entry { get; set; }
|
|
public bool can_Ringing_In_Pstn_Call { get; set; }
|
|
public bool can_Switch_To_Specific_Camera { get; set; }
|
|
public bool is_Airhost_Disabled { get; set; }
|
|
public bool pstn_Call_In_Local_resentation { get; set; }
|
|
public bool support_Claim_Host { get; set; }
|
|
public bool support_Out_Room_Display { get; set; }
|
|
public bool support_Pin_And_Spotlight { get; set; }
|
|
public bool supports_Audio_Checkup { get; set; }
|
|
public bool supports_CheckIn { get; set; }
|
|
public bool supports_Cloud_PBX { get; set; }
|
|
public bool supports_Encrypted_Connection { get; set; }
|
|
public bool supports_Expel_User_Permanently { get; set; }
|
|
public bool supports_H323_DTMF { get; set; }
|
|
public bool supports_Hdmi_Cec_Control { get; set; }
|
|
public bool supports_Highly_Reverberant_Room { get; set; }
|
|
public bool supports_Loading_Contacts_Dynamically { get; set; }
|
|
public bool supports_Loading_Participants_Dynamically { get; set; }
|
|
public bool supports_Mic_Record_Test { get; set; }
|
|
public bool supports_Multi_Share { get; set; }
|
|
public bool supports_ShareCamera { get; set; }
|
|
public bool supports_Share_For_Floating_And_Content_Only { get; set; }
|
|
public bool supports_Sip_Call_out { get; set; }
|
|
public bool supports_Software_Audio_Processing { get; set; }
|
|
public bool supports_Web_Settings_Push { get; set; }
|
|
}
|
|
|
|
public class Sharing : NotifiableObject
|
|
{
|
|
private string _dispState;
|
|
private string _password;
|
|
|
|
public string directPresentationPairingCode { get; set; }
|
|
/// <summary>
|
|
/// Laptop client sharing key
|
|
/// </summary>
|
|
public string directPresentationSharingKey { get; set; }
|
|
public string dispState
|
|
{
|
|
get
|
|
{
|
|
return _dispState;
|
|
}
|
|
set
|
|
{
|
|
if (value != _dispState)
|
|
{
|
|
_dispState = value;
|
|
NotifyPropertyChanged("dispState");
|
|
}
|
|
}
|
|
}
|
|
public bool isAirHostClientConnected { get; set; }
|
|
public bool isBlackMagicConnected { get; set; }
|
|
public bool isBlackMagicDataAvailable { get; set; }
|
|
public bool isDirectPresentationConnected { get; set; }
|
|
public bool isSharingBlackMagic { get; set; }
|
|
/// <summary>
|
|
/// IOS Airplay code
|
|
/// </summary>
|
|
public string password
|
|
{
|
|
get
|
|
{
|
|
return _password;
|
|
}
|
|
set
|
|
{
|
|
if (value != _password)
|
|
{
|
|
_password = value;
|
|
NotifyPropertyChanged("password");
|
|
}
|
|
}
|
|
}
|
|
public string serverName { get; set; }
|
|
public string wifiName { get; set; }
|
|
}
|
|
|
|
public class NumberOfScreens
|
|
{
|
|
[JsonProperty("NumberOfCECScreens")]
|
|
public int NumOfCECScreens { get; set; }
|
|
[JsonProperty("NumberOfScreens")]
|
|
public int NumOfScreens { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// AudioInputLine/AudioOutputLine/VideoCameraLine list item
|
|
/// </summary>
|
|
public class AudioVideoInputOutputLineItem
|
|
{
|
|
public string Alias { get; set; }
|
|
public string Name { get; set; }
|
|
public bool Selected { get; set; }
|
|
public bool combinedDevice { get; set; }
|
|
public string id { get; set; }
|
|
public bool manuallySelected { get; set; }
|
|
public int numberOfCombinedDevices { get; set; }
|
|
public int ptzComId { get; set; }
|
|
}
|
|
|
|
public class Video
|
|
{
|
|
public bool Optimizable { get; set; }
|
|
}
|
|
|
|
public class CameraShare : NotifiableObject
|
|
{
|
|
private bool _canControlCamera;
|
|
private bool _isSharing;
|
|
|
|
[JsonProperty("can_Control_Camera")]
|
|
public bool CanControlCamera
|
|
{
|
|
get
|
|
{
|
|
return _canControlCamera;
|
|
}
|
|
set
|
|
{
|
|
if (value != _canControlCamera)
|
|
{
|
|
_canControlCamera = value;
|
|
NotifyPropertyChanged("CanControlCamera");
|
|
}
|
|
}
|
|
}
|
|
public string id { get; set; }
|
|
public bool is_Mirrored { get; set; }
|
|
[JsonProperty("is_Sharing")]
|
|
public bool IsSharing
|
|
{
|
|
get
|
|
{
|
|
return _isSharing;
|
|
}
|
|
set
|
|
{
|
|
if (value != _isSharing)
|
|
{
|
|
_isSharing = value;
|
|
NotifyPropertyChanged("IsSharing");
|
|
}
|
|
}
|
|
}
|
|
public int pan_Tilt_Speed { get; set; }
|
|
|
|
}
|
|
|
|
public class Layout
|
|
{
|
|
public bool can_Adjust_Floating_Video { get; set; }
|
|
public bool can_Switch_Floating_Share_Content { get; set; }
|
|
public bool can_Switch_Share_On_All_Screens { get; set; }
|
|
public bool can_Switch_Speaker_View { get; set; }
|
|
public bool can_Switch_Wall_View { get; set; }
|
|
public bool is_In_First_Page { get; set; }
|
|
public bool is_In_Last_Page { get; set; }
|
|
public bool is_supported { get; set; }
|
|
public int video_Count_In_Current_Page { get; set; }
|
|
public string video_type { get; set; }
|
|
}
|
|
|
|
public class CallRecordInfo
|
|
{
|
|
public bool canRecord { get; set; }
|
|
public bool emailRequired { get; set; }
|
|
public bool amIRecording { get; set; }
|
|
public bool meetingIsBeingRecorded { get; set; }
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// zEvent Class Structure
|
|
/// </summary>
|
|
public class zEvent
|
|
{
|
|
public class NeedWaitForHost
|
|
{
|
|
public bool Wait { get; set; }
|
|
}
|
|
|
|
public class IncomingCallIndication
|
|
{
|
|
public string callerJID { get; set; }
|
|
public string calleeJID { get; set; }
|
|
public string meetingID { get; set; }
|
|
public string password { get; set; }
|
|
public string meetingOption { get; set; }
|
|
public int MeetingNumber { get; set; }
|
|
public string callerName { get; set; }
|
|
public string avatarURL { get; set; }
|
|
public int lifeTime { get; set; }
|
|
public bool accepted { get; set; }
|
|
}
|
|
|
|
public class CallConnectError
|
|
{
|
|
public int error_code { get; set; }
|
|
public string error_message { get; set; }
|
|
}
|
|
|
|
public class CallDisconnect
|
|
{
|
|
public bool Successful
|
|
{
|
|
get
|
|
{
|
|
return success == "on";
|
|
}
|
|
}
|
|
|
|
public string success { get; set; }
|
|
}
|
|
|
|
public class Layout
|
|
{
|
|
public bool Sharethumb { get; set; }
|
|
}
|
|
|
|
public class Call
|
|
{
|
|
public Layout Layout { get; set; }
|
|
}
|
|
|
|
public class Client
|
|
{
|
|
public Call Call { get; set; }
|
|
}
|
|
|
|
public enum eSharingState
|
|
{
|
|
None,
|
|
Connecting,
|
|
Sending,
|
|
Receiving,
|
|
Send_Receiving
|
|
}
|
|
|
|
public class SharingState : NotifiableObject
|
|
{
|
|
private bool _paused;
|
|
private eSharingState _state;
|
|
|
|
public bool IsSharing;
|
|
|
|
[JsonProperty("paused")]
|
|
public bool Paused
|
|
{
|
|
get
|
|
{
|
|
return _paused;
|
|
}
|
|
set
|
|
{
|
|
if (value != _paused)
|
|
{
|
|
_paused = value;
|
|
NotifyPropertyChanged("Paused");
|
|
}
|
|
}
|
|
}
|
|
[JsonProperty("state")]
|
|
public eSharingState State
|
|
{
|
|
get
|
|
{
|
|
return _state;
|
|
}
|
|
set
|
|
{
|
|
if (value != _state)
|
|
{
|
|
_state = value;
|
|
IsSharing = _state == eSharingState.Sending;
|
|
NotifyPropertyChanged("State");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public class PinStatusOfScreenNotification
|
|
{
|
|
[JsonProperty("can_be_pinned")]
|
|
public bool CanBePinned { get; set; }
|
|
[JsonProperty("can_pin_share")]
|
|
public bool CanPinShare { get; set; }
|
|
[JsonProperty("pinned_share_source_id")]
|
|
public int PinnedShareSourceId { get; set; }
|
|
[JsonProperty("pinned_user_id")]
|
|
public int PinnedUserId { get; set; }
|
|
[JsonProperty("screen_index")]
|
|
public int ScreenIndex { get; set; }
|
|
[JsonProperty("screen_layout")]
|
|
public int ScreenLayout { get; set; }
|
|
[JsonProperty("share_source_type")]
|
|
public int ShareSourceType { get; set; }
|
|
[JsonProperty("why_cannot_pin_share")]
|
|
public string WhyCannotPinShare { get; set; }
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// zConfiguration class structure
|
|
/// </summary>
|
|
public class zConfiguration
|
|
{
|
|
public class Sharing
|
|
{
|
|
[JsonProperty("optimize_video_sharing")]
|
|
public bool OptimizeVideoSharing { get; set; }
|
|
}
|
|
|
|
public class Camera
|
|
{
|
|
public bool Mute { get; set; }
|
|
}
|
|
|
|
public class Microphone : NotifiableObject
|
|
{
|
|
private bool _mute;
|
|
|
|
public bool Mute
|
|
{
|
|
get
|
|
{
|
|
return _mute;
|
|
}
|
|
set
|
|
{
|
|
if(value != _mute)
|
|
{
|
|
_mute = value;
|
|
NotifyPropertyChanged("Mute");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public enum eLayoutStyle
|
|
{
|
|
Gallery,
|
|
Speaker,
|
|
Strip,
|
|
ShareAll
|
|
}
|
|
|
|
public enum eLayoutSize
|
|
{
|
|
Off,
|
|
Size1,
|
|
Size2,
|
|
Size3,
|
|
Strip
|
|
}
|
|
|
|
public enum eLayoutPosition
|
|
{
|
|
Center,
|
|
Up,
|
|
Right,
|
|
UpRight,
|
|
Down,
|
|
DownRight,
|
|
Left,
|
|
UpLeft,
|
|
DownLeft
|
|
}
|
|
|
|
public class Layout
|
|
{
|
|
public bool ShareThumb { get; set; }
|
|
public eLayoutStyle Style { get; set; }
|
|
public eLayoutSize Size { get; set; }
|
|
public eLayoutPosition Position { get; set; }
|
|
}
|
|
|
|
public class Lock
|
|
{
|
|
public bool Enable { get; set; }
|
|
}
|
|
|
|
public class ClosedCaption
|
|
{
|
|
public bool Visible { get; set; }
|
|
public int FontSize { get; set; }
|
|
}
|
|
|
|
public class MuteUserOnEntry
|
|
{
|
|
public bool Enable { get; set; }
|
|
}
|
|
|
|
public class Call
|
|
{
|
|
public Sharing Sharing { get; set; }
|
|
public Camera Camera { get; set; }
|
|
public Microphone Microphone { get; set; }
|
|
public Layout Layout { get; set; }
|
|
public Lock Lock { get; set; }
|
|
public MuteUserOnEntry MuteUserOnEntry { get; set; }
|
|
public ClosedCaption ClosedCaption { get; set; }
|
|
|
|
|
|
public Call()
|
|
{
|
|
Sharing = new Sharing();
|
|
Camera = new Camera();
|
|
Microphone = new Microphone();
|
|
Layout = new Layout();
|
|
Lock = new Lock();
|
|
MuteUserOnEntry = new MuteUserOnEntry();
|
|
ClosedCaption = new ClosedCaption();
|
|
}
|
|
}
|
|
|
|
public class Audio
|
|
{
|
|
public Input Input { get; set; }
|
|
public Output Output { get; set; }
|
|
|
|
public Audio()
|
|
{
|
|
Input = new Input();
|
|
Output = new Output();
|
|
}
|
|
}
|
|
|
|
public class Input : Output
|
|
{
|
|
[JsonProperty("reduce_reverb")]
|
|
public bool ReduceReverb { get; set; }
|
|
}
|
|
|
|
public class Output : NotifiableObject
|
|
{
|
|
private int _volume;
|
|
|
|
[JsonProperty("volume")]
|
|
public int Volume
|
|
{
|
|
get
|
|
{
|
|
return this._volume;
|
|
}
|
|
set
|
|
{
|
|
if (value != _volume)
|
|
{
|
|
this._volume = value;
|
|
NotifyPropertyChanged("Volume");
|
|
}
|
|
}
|
|
}
|
|
[JsonProperty("selectedId")]
|
|
public string SelectedId { get; set; }
|
|
[JsonProperty("is_sap_disabled")]
|
|
public bool IsSapDisabled { get; set; }
|
|
}
|
|
|
|
public class Video : NotifiableObject
|
|
{
|
|
private bool _hideConfSelfVideo;
|
|
|
|
[JsonProperty("hide_conf_self_video")]
|
|
public bool HideConfSelfVideo
|
|
{
|
|
get
|
|
{
|
|
return _hideConfSelfVideo;
|
|
}
|
|
set
|
|
{
|
|
if (value != _hideConfSelfVideo)
|
|
{
|
|
_hideConfSelfVideo = value;
|
|
NotifyPropertyChanged("HideConfSelfVideo");
|
|
}
|
|
}
|
|
}
|
|
|
|
public VideoCamera Camera { get; set; }
|
|
|
|
public Video()
|
|
{
|
|
Camera = new VideoCamera();
|
|
}
|
|
}
|
|
|
|
public class VideoCamera : NotifiableObject
|
|
{
|
|
private string _selectedId;
|
|
|
|
[JsonProperty("selectedId")]
|
|
public string SelectedId {
|
|
get
|
|
{
|
|
return _selectedId;
|
|
}
|
|
set
|
|
{
|
|
if (value != _selectedId)
|
|
{
|
|
_selectedId = value;
|
|
NotifyPropertyChanged("SelectedId");
|
|
}
|
|
}
|
|
|
|
}
|
|
public bool Mirror { get; set; }
|
|
}
|
|
|
|
public class Client
|
|
{
|
|
public string appVersion { get; set; }
|
|
public string deviceSystem { get; set; }
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// zCommand class structure
|
|
/// </summary>
|
|
public class zCommand
|
|
{
|
|
public partial class BookingsListResult
|
|
{
|
|
[JsonProperty("accessRole")]
|
|
public string AccessRole { get; set; }
|
|
[JsonProperty("calendarChangeKey")]
|
|
public string CalendarChangeKey { get; set; }
|
|
[JsonProperty("calendarID")]
|
|
public string CalendarId { get; set; }
|
|
[JsonProperty("checkIn")]
|
|
public bool CheckIn { get; set; }
|
|
[JsonProperty("creatorEmail")]
|
|
public string CreatorEmail { get; set; }
|
|
[JsonProperty("creatorName")]
|
|
public string CreatorName { get; set; }
|
|
[JsonProperty("endTime")]
|
|
public DateTime EndTime { get; set; }
|
|
[JsonProperty("hostName")]
|
|
public string HostName { get; set; }
|
|
[JsonProperty("isInstantMeeting")]
|
|
public bool IsInstantMeeting { get; set; }
|
|
[JsonProperty("isPrivate")]
|
|
public bool IsPrivate { get; set; }
|
|
[JsonProperty("location")]
|
|
public string Location { get; set; }
|
|
[JsonProperty("meetingName")]
|
|
public string MeetingName { get; set; }
|
|
[JsonProperty("meetingNumber")]
|
|
public string MeetingNumber { get; set; }
|
|
[JsonProperty("scheduledFrom")]
|
|
public string ScheduledFrom { get; set; }
|
|
[JsonProperty("startTime")]
|
|
public DateTime StartTime { get; set; }
|
|
[JsonProperty("third_party")]
|
|
public ThirdParty ThirdParty { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Extracts the necessary meeting values from the Cisco bookings response ans converts them to the generic class
|
|
/// </summary>
|
|
/// <param name="bookings"></param>
|
|
/// <returns></returns>
|
|
public static List<Meeting> GetGenericMeetingsFromBookingResult(List<BookingsListResult> bookings)
|
|
{
|
|
var meetings = new List<Meeting>();
|
|
|
|
if (Debug.Level > 0)
|
|
{
|
|
Debug.Console(1, "Meetings List:\n");
|
|
}
|
|
|
|
foreach (var b in bookings)
|
|
{
|
|
var meeting = new Meeting();
|
|
|
|
if (b.MeetingNumber != null)
|
|
meeting.Id = b.MeetingNumber;
|
|
if (b.CreatorName != null)
|
|
meeting.Organizer = b.CreatorName;
|
|
if (b.MeetingName != null)
|
|
meeting.Title = b.MeetingName;
|
|
//if (b.Agenda != null)
|
|
// meeting.Agenda = b.Agenda.Value;
|
|
if (b.StartTime != null)
|
|
meeting.StartTime = b.StartTime;
|
|
if (b.EndTime != null)
|
|
meeting.EndTime = b.EndTime;
|
|
|
|
meeting.Privacy = b.IsPrivate ? eMeetingPrivacy.Private : eMeetingPrivacy.Public;
|
|
|
|
// No meeting.Calls data exists for Zoom Rooms. Leaving out for now.
|
|
|
|
meetings.Add(meeting);
|
|
|
|
if (Debug.Level > 0)
|
|
{
|
|
Debug.Console(1, "Title: {0}, ID: {1}, Organizer: {2}", meeting.Title, meeting.Id, meeting.Organizer);
|
|
Debug.Console(1, " Start Time: {0}, End Time: {1}, Duration: {2}", meeting.StartTime, meeting.EndTime, meeting.Duration);
|
|
Debug.Console(1, " Joinable: {0}\n", meeting.Joinable);
|
|
}
|
|
}
|
|
|
|
meetings.OrderBy(m => m.StartTime);
|
|
|
|
return meetings;
|
|
}
|
|
|
|
public class HandStatus
|
|
{
|
|
[JsonProperty("is_raise_hand")]
|
|
public bool IsRaiseHand { get; set; }
|
|
[JsonProperty("optimize_vis_validideo_sharing")]
|
|
public string IsValid { get; set; }
|
|
[JsonProperty("time_stamp")]
|
|
public string TimeStamp { get; set; }
|
|
}
|
|
|
|
public class ListParticipant
|
|
{
|
|
[JsonProperty("audio_status state")]
|
|
public string AudioStatusState { get; set; }
|
|
[JsonProperty("audio_status type")]
|
|
public string AudioStatusType { get; set; }
|
|
[JsonProperty("avatar_url")]
|
|
public string AvatarUrl { get; set; }
|
|
[JsonProperty("camera_status am_i_controlling")]
|
|
public bool CameraStatusAmIControlling { get; set; }
|
|
[JsonProperty("camera_status can_i_request_control")]
|
|
public bool CameraStatusCanIRequestConrol { get; set; }
|
|
[JsonProperty("camera_status can_move_camera")]
|
|
public bool CameraStatusCanMoveCamera { get; set; }
|
|
[JsonProperty("camera_status can_switch_camera")]
|
|
public bool CameraStatusCanSwitchCamera { get; set; }
|
|
[JsonProperty("camera_status can_zoom_camera")]
|
|
public bool CameraStatusCanZoomCamera { get; set; }
|
|
[JsonProperty("can_edit_closed_caption")]
|
|
public bool CanEditClosedCaption { get; set; }
|
|
[JsonProperty("can_record")]
|
|
public bool CanRecord { get; set; }
|
|
[JsonProperty("event")]
|
|
public string Event { get; set; }
|
|
[JsonProperty("hand_status")]
|
|
public HandStatus HandStatus { get; set; }
|
|
[JsonProperty("isCohost")]
|
|
public bool IsCohost { get; set; }
|
|
[JsonProperty("is_client_support_closed_caption")]
|
|
public bool IsClientSupportClosedCaption { get; set; }
|
|
[JsonProperty("is_client_support_coHost")]
|
|
public bool IsClientSupportCoHost { get; set; }
|
|
[JsonProperty("is_host")]
|
|
public bool IsHost { get; set; }
|
|
[JsonProperty("is_myself")]
|
|
public bool IsMyself { get; set; }
|
|
[JsonProperty("is_recording")]
|
|
public bool IsRecording { get; set; }
|
|
[JsonProperty("is_video_can_mute_byHost")]
|
|
public bool IsVideoCanMuteByHost { get; set; }
|
|
[JsonProperty("is_video_can_unmute_byHost")]
|
|
public bool IsVideoCanUnmuteByHost { get; set; }
|
|
[JsonProperty("local_recording_disabled")]
|
|
public bool LocalRecordingDisabled { get; set; }
|
|
[JsonProperty("user_id")]
|
|
public int UserId { get; set; }
|
|
[JsonProperty("user_name")]
|
|
public string UserName { get; set; }
|
|
[JsonProperty("user_type")]
|
|
public string UserType { get; set; }
|
|
[JsonProperty("video_status has_source")]
|
|
public bool VideoStatusHasSource { get; set; }
|
|
[JsonProperty("video_status is_receiving")]
|
|
public bool VideoStatusIsReceiving { get; set; }
|
|
[JsonProperty("video_status is_sending")]
|
|
public bool VideoStatusIsSending { get; set; }
|
|
|
|
public ListParticipant()
|
|
{
|
|
HandStatus = new HandStatus();
|
|
}
|
|
}
|
|
|
|
public class CallinCountryList
|
|
{
|
|
public int code { get; set; }
|
|
public string display_number { get; set; }
|
|
public string id { get; set; }
|
|
public string name { get; set; }
|
|
public string number { get; set; }
|
|
}
|
|
|
|
public class CalloutCountryList
|
|
{
|
|
public int code { get; set; }
|
|
public string display_number { get; set; }
|
|
public string id { get; set; }
|
|
public string name { get; set; }
|
|
public string number { get; set; }
|
|
}
|
|
|
|
public class TollFreeCallinList
|
|
{
|
|
public int code { get; set; }
|
|
public string display_number { get; set; }
|
|
public string id { get; set; }
|
|
public string name { get; set; }
|
|
public string number { get; set; }
|
|
}
|
|
|
|
public class Info
|
|
{
|
|
public List<CallinCountryList> callin_country_list { get; set; }
|
|
public List<CalloutCountryList> callout_country_list { get; set; }
|
|
public List<TollFreeCallinList> toll_free_callin_list { get; set; }
|
|
}
|
|
|
|
public class ThirdParty
|
|
{
|
|
public string h323_address { get; set; }
|
|
public string meeting_number { get; set; }
|
|
public string service_provider { get; set; }
|
|
public string sip_address { get; set; }
|
|
}
|
|
|
|
public class MeetingListItem
|
|
{
|
|
public string accessRole { get; set; }
|
|
public string calendarChangeKey { get; set; }
|
|
public string calendarID { get; set; }
|
|
public bool checkIn { get; set; }
|
|
public string creatorEmail { get; set; }
|
|
public string creatorName { get; set; }
|
|
public string endTime { get; set; }
|
|
public string hostName { get; set; }
|
|
public bool isInstantMeeting { get; set; }
|
|
public bool isPrivate { get; set; }
|
|
public string location { get; set; }
|
|
public string meetingName { get; set; }
|
|
public string meetingNumber { get; set; }
|
|
public string scheduledFrom { get; set; }
|
|
public string startTime { get; set; }
|
|
public ThirdParty third_party { get; set; }
|
|
|
|
public MeetingListItem()
|
|
{
|
|
third_party = new ThirdParty();
|
|
}
|
|
}
|
|
|
|
public class InfoResult
|
|
{
|
|
public Info Info { get; set; }
|
|
public bool am_i_original_host { get; set; }
|
|
public string default_callin_country { get; set; }
|
|
public string dialIn { get; set; }
|
|
public string international_url { get; set; }
|
|
public string invite_email_content { get; set; }
|
|
public string invite_email_subject { get; set; }
|
|
public bool is_callin_country_list_available { get; set; }
|
|
public bool is_calling_room_system_enabled { get; set; }
|
|
public bool is_toll_free_callin_list_available { get; set; }
|
|
public bool is_view_only { get; set; }
|
|
public bool is_waiting_room { get; set; }
|
|
public bool is_webinar { get; set; }
|
|
public string meeting_id { get; set; }
|
|
public MeetingListItem meeting_list_item { get; set; }
|
|
public string meeting_password { get; set; }
|
|
public string meeting_type { get; set; }
|
|
public int my_userid { get; set; }
|
|
public int participant_id { get; set; }
|
|
public string real_meeting_id { get; set; }
|
|
public string schedule_option { get; set; }
|
|
public string schedule_option2 { get; set; }
|
|
public string support_callout_type { get; set; }
|
|
public string toll_free_number { get; set; }
|
|
public string user_type { get; set; }
|
|
|
|
public InfoResult()
|
|
{
|
|
Info = new Info();
|
|
meeting_list_item = new MeetingListItem();
|
|
}
|
|
}
|
|
|
|
public class Phonebook
|
|
{
|
|
public List<zStatus.Contact> Contacts { get; set; }
|
|
public int Limit { get; set; }
|
|
public int Offset { get; set; }
|
|
}
|
|
}
|
|
} |