public static VidyoConversation CreateVideoConversation(VideoConversationInitializationParameters parameters)
        {
            using (Trace.Config.scope())
            {
                try
                {
                    // Initialize the conversation object
                    var conversation = new VidyoConversation
                    {
                        ScopedQueueName          = parameters.ScopedQueueName,
                        Room                     = VidyoServiceClient.CreateRoom(),
                        InitializationParameters = parameters
                    };

                    // Commit the conversation
                    Save(conversation);

                    return(conversation);
                }
                catch (Exception ex)
                {
                    Trace.WriteEventError(ex, "Error in CreateConversation: " + ex.Message, EventId.GenericError);
                    return(null);
                }
            }
        }
 public static void RemoveConversation(VidyoConversation conversation)
 {
     using (Trace.Config.scope())
     {
         try
         {
             lock (ConversationLocker)
             {
                 if (Conversations.Contains(conversation))
                 {
                     Trace.Config.note("Removing conversation {}" + conversation.ConversationId);
                     Conversations.Remove(conversation);
                     Delete(conversation.ConversationId.ToString());
                 }
                 else
                 {
                     Trace.Config.warning(
                         "Unable to remove conversation {} because it does not exist in the list.",
                         conversation.ConversationId);
                 }
             }
         }
         catch (Exception ex)
         {
             Trace.WriteEventError(ex, "Error in RemoveConversation: " + ex.Message, EventId.GenericError);
         }
     }
 }
        public static void Save(VidyoConversation conversation)
        {
            using (Trace.Config.scope())
            {
                try
                {
                    // Create path
                    var filename = Path.Combine(ConversationFilePath, conversation.ConversationId.ToString()) +
                                   ".conversation";

                    // Save file
                    Trace.Config.always("Saving conversation {} to as {}", conversation.ConversationId, filename);

                    // Lock on the filename to prevent multiple saves to the same file at the same time
                    lock (conversation.WriteLocker)
                    {
                        Trace.Config.verbose("Filename lock obtained: {}", filename);

                        // Add to list if not already there
                        if (!Conversations.Contains(conversation))
                        {
                            Conversations.Add(conversation);
                        }

                        // Write file
                        using (var fs = File.Open(filename, FileMode.Create, FileAccess.Write, FileShare.None))
                            using (var sw = new StreamWriter(fs))
                                using (var jw = new JsonTextWriter(sw))
                                {
                                    jw.Formatting = Formatting.Indented;

                                    //Serializer.Serialize(jw, conversation);
                                    //var p = JsonConvert.SerializeObject(conversation.InitializationParameters, Formatting.Indented, new JsonSerializerSettings
                                    //{
                                    //    ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
                                    //    PreserveReferencesHandling = PreserveReferencesHandling.Objects
                                    //});

                                    var data = JsonConvert.SerializeObject(conversation, Formatting.Indented, new JsonSerializerSettings
                                    {
                                        ReferenceLoopHandling      = ReferenceLoopHandling.Serialize,
                                        PreserveReferencesHandling = PreserveReferencesHandling.Objects
                                    });

                                    jw.WriteRawValue(data);
                                }

                        Trace.Config.always("Conversation {} saved", conversation.ConversationId);
                    }
                }
                catch (Exception ex)
                {
                    Trace.WriteEventError(ex, "Error in Save: " + ex.Message, EventId.GenericError);
                }
            }
        }