Class used to compare two event files together, stores the results for display in the UI
Esempio n. 1
0
        /// <summary>
        /// Initializes a new instance of the CompareFileData class and sets properties based on the FileData provided
        /// </summary>
        /// <param name="leftFile">First set of FileData to use in comparison</param>
        /// <param name="rightFile">Second set of FileData to use in comparison</param>
        public CompareFileData(FileData leftFile, FileData rightFile)
        {
            if (leftFile == null)
            {
                throw new ArgumentNullException("leftFile");
            }

            if (rightFile == null)
            {
                throw new ArgumentNullException("rightFile");
            }

            this.LeftFileData    = leftFile;
            this.RightFileData   = rightFile;
            this.FileCompareText = string.Format(Strings.CompareFilesHeader, Path.GetFileName(leftFile.FileName), Path.GetFileName(rightFile.FileName));
            bool samePublicMetadata   = true;
            bool samePersonalMetadata = true;

            this.PublicMetadata   = CompareFileData.CompareMetadata(leftFile.PublicMetadata, rightFile.PublicMetadata, out samePublicMetadata);
            this.PersonalMetadata = CompareFileData.CompareMetadata(leftFile.PersonalMetadata, rightFile.PersonalMetadata, out samePersonalMetadata);
            this.Streams          = CompareFileData.CompareStreams(leftFile.Streams, rightFile.Streams);

            if (leftFile.PublicMetadata.Count == 0 && rightFile.PublicMetadata.Count == 0)
            {
                this.PublicMetadataCompareText = string.Format(Strings.PublicMetadataHeader, Strings.None);
            }
            else
            {
                this.PublicMetadataCompareText = string.Format(Strings.PublicMetadataHeader, samePublicMetadata ? Strings.Same : Strings.Different);
            }

            if (leftFile.PersonalMetadata.Count == 0 && rightFile.PersonalMetadata.Count == 0)
            {
                this.PersonalMetadataCompareText = string.Format(Strings.PersonalMetadataHeader, Strings.None);
            }
            else
            {
                this.PersonalMetadataCompareText = string.Format(Strings.PersonalMetadataHeader, samePersonalMetadata ? Strings.Same : Strings.Different);
            }

            if (leftFile.Streams.Count == 0 && rightFile.Streams.Count == 0)
            {
                this.StreamsCompareText = string.Format(Strings.StreamsHeader, Strings.None);
            }
            else
            {
                bool sameStreamData = this.Streams.All(data => data.Same);
                this.StreamsCompareText = string.Format(Strings.StreamsHeader, sameStreamData ? Strings.Same : Strings.Different);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Handles the click event for the 'Compare Files' button
        /// </summary>
        /// <param name="sender">sender object</param>
        /// <param name="e">routed event args</param>
        private void CompareFiles_Click(object sender, RoutedEventArgs e)
        {
            State previous = this.currentState;

            this.WaitMessageText = Strings.WaitForCompareFiles;
            this.CurrentState    = State.Wait;

            string           file1      = string.Empty;
            string           file2      = string.Empty;
            KStudioEventFile eventFile2 = null;

            try
            {
                // open the first file, if not already opened for View
                if (this.fileData == null)
                {
                    // open a new file
                    file1 = this.OpenFileForInspection();

                    // if user cancels from OpenFileDialog, return to previous state
                    if (string.IsNullOrEmpty(file1))
                    {
                        this.CurrentState = previous;
                        return;
                    }
                }

                // open a second file to compare with the first
                file2 = this.OpenFileForInspection();

                // if the user cancels from OpenFileDialog, return to the previous state
                if (string.IsNullOrEmpty(file2))
                {
                    this.CurrentState = previous;
                    return;
                }

                // create a FileData object for the first file, unless one already exists
                if (this.fileData == null)
                {
                    this.eventFile = this.client.OpenEventFile(file1);
                    this.fileData  = new FileData(this.eventFile);
                }

                // create a second FileData object for comparison
                eventFile2 = this.client.OpenEventFile(file2);
                FileData fileData2 = new FileData(eventFile2);

                // compare data between files
                CompareFileData compareData = new CompareFileData(this.fileData, fileData2);
                this.ViewCompareFileDataGrid.DataContext = compareData;

                // show comparison data
                this.CurrentState = State.Compare;
            }
            catch (Exception ex)
            {
                this.ErrorMessageText = string.Format(Strings.ErrorCompareFilesFailed, ex.Message);
                this.CurrentState     = State.Error;
            }
            finally
            {
                if (eventFile2 != null)
                {
                    eventFile2.Dispose();
                    eventFile2 = null;
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Handles the click event for the 'Compare Files' button
        /// </summary>
        /// <param name="sender">sender object</param>
        /// <param name="e">routed event args</param>
        private void CompareFiles_Click(object sender, RoutedEventArgs e)
        {
            State previous = this.currentState;
            this.WaitMessageText = Strings.WaitForCompareFiles;
            this.CurrentState = State.Wait;

            string file1 = string.Empty;
            string file2 = string.Empty;
            KStudioEventFile eventFile2 = null;

            try
            {
                // open the first file, if not already opened for View
                if (this.fileData == null)
                {
                    // open a new file
                    file1 = this.OpenFileForInspection();

                    // if user cancels from OpenFileDialog, return to previous state
                    if (string.IsNullOrEmpty(file1))
                    {
                        this.CurrentState = previous;
                        return;
                    }
                }

                // open a second file to compare with the first
                file2 = this.OpenFileForInspection();

                // if the user cancels from OpenFileDialog, return to the previous state
                if (string.IsNullOrEmpty(file2))
                {
                    this.CurrentState = previous;
                    return;
                }

                // create a FileData object for the first file, unless one already exists
                if (this.fileData == null)
                {
                    this.eventFile = this.client.OpenEventFile(file1);
                    this.fileData = new FileData(this.eventFile);
                }

                // create a second FileData object for comparison
                eventFile2 = this.client.OpenEventFile(file2);
                FileData fileData2 = new FileData(eventFile2);

                // compare data between files
                CompareFileData compareData = new CompareFileData(this.fileData, fileData2);
                this.ViewCompareFileDataGrid.DataContext = compareData;

                // show comparison data
                this.CurrentState = State.Compare;
            }
            catch (Exception ex)
            {
                this.ErrorMessageText = string.Format(Strings.ErrorCompareFilesFailed, ex.Message);
                this.CurrentState = State.Error;
            }
            finally
            {
                if (eventFile2 != null)
                {
                    eventFile2.Dispose();
                    eventFile2 = null;
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Initializes a new instance of the CompareStreamData class and sets all properties based on the StreamData provided
        /// </summary>
        /// <param name="leftStream">First StreamData object to use for comparison</param>
        /// <param name="rightStream">Second StreamData object to use for comparison</param>
        public CompareStreamData(StreamData leftStream, StreamData rightStream)
        {
            if (leftStream == null && rightStream == null)
            {
                throw new InvalidOperationException(Strings.ErrorNoStreams);
            }

            this.StreamName = Strings.Unknown;
            this.LeftPublicMetadataCount    = 0;
            this.RightPublicMetadataCount   = 0;
            this.LeftPersonalMetadataCount  = 0;
            this.RightPersonalMetadataCount = 0;
            string          dataTypeIdKey         = Strings.DataTypeIdHeader;
            string          semanticIdKey         = Strings.SemanticIdHeader;
            string          eventCountKey         = Strings.EventCountHeader;
            string          startTimeKey          = Strings.StreamStartTimeHeader;
            string          endTimeKey            = Strings.StreamEndTimeHeader;
            string          leftSemanticId        = string.Empty;
            string          rightSemanticId       = string.Empty;
            string          leftEventCount        = string.Empty;
            string          rightEventCount       = string.Empty;
            string          leftStartTime         = string.Empty;
            string          rightStartTime        = string.Empty;
            string          leftEndTime           = string.Empty;
            string          rightEndTime          = string.Empty;
            string          leftDataTypeId        = string.Empty;
            string          rightDataTypeId       = string.Empty;
            KStudioMetadata leftPublicMetadata    = null;
            KStudioMetadata rightPublicMetadata   = null;
            KStudioMetadata leftPersonalMetadata  = null;
            KStudioMetadata rightPersonalMetadata = null;

            if (leftStream != null)
            {
                this.StreamName                = leftStream.EventStream.DataTypeName;
                leftSemanticId                 = leftStream.EventStream.SemanticId.ToString();
                leftEventCount                 = leftStream.EventHeaders.Count.ToString();
                leftStartTime                  = leftStream.StartTime.ToString();
                leftEndTime                    = leftStream.EndTime.ToString();
                leftDataTypeId                 = leftStream.EventStream.DataTypeId.ToString();
                leftPublicMetadata             = leftStream.PublicMetadata;
                leftPersonalMetadata           = leftStream.PersonalMetadata;
                this.LeftPublicMetadataCount   = leftStream.PublicMetadata.Count;
                this.LeftPersonalMetadataCount = leftStream.PersonalMetadata.Count;
            }

            if (rightStream != null)
            {
                if (leftStream == null)
                {
                    this.StreamName = rightStream.EventStream.DataTypeName;
                }

                rightSemanticId                 = rightStream.EventStream.SemanticId.ToString();
                rightEventCount                 = rightStream.EventHeaders.Count.ToString();
                rightStartTime                  = rightStream.StartTime.ToString();
                rightEndTime                    = rightStream.EndTime.ToString();
                rightDataTypeId                 = rightStream.EventStream.DataTypeId.ToString();
                rightPublicMetadata             = rightStream.PublicMetadata;
                rightPersonalMetadata           = rightStream.PersonalMetadata;
                this.RightPublicMetadataCount   = rightStream.PublicMetadata.Count;
                this.RightPersonalMetadataCount = rightStream.PersonalMetadata.Count;
            }

            // compare stream metadata
            bool samePublicMetadata   = true;
            bool samePersonalMetadata = true;

            this.PublicMetadata   = CompareFileData.CompareMetadata(leftPublicMetadata, rightPublicMetadata, out samePublicMetadata);
            this.PersonalMetadata = CompareFileData.CompareMetadata(leftPersonalMetadata, rightPersonalMetadata, out samePersonalMetadata);

            if (this.LeftPublicMetadataCount == 0 && this.RightPublicMetadataCount == 0)
            {
                this.StreamPublicMetadataCompareText = string.Format(Strings.PublicMetadataHeader, Strings.None);
            }
            else
            {
                this.StreamPublicMetadataCompareText = string.Format(Strings.PublicMetadataHeader, samePublicMetadata ? Strings.Same : Strings.Different);
            }

            if (this.LeftPersonalMetadataCount == 0 && this.RightPersonalMetadataCount == 0)
            {
                this.StreamPersonalMetadataCompareText = string.Format(Strings.PersonalMetadataHeader, Strings.None);
            }
            else
            {
                this.StreamPersonalMetadataCompareText = string.Format(Strings.PersonalMetadataHeader, samePersonalMetadata ? Strings.Same : Strings.Different);
            }

            // compare stream details
            this.StreamDetails = new ObservableCollection <CompareData>();
            this.StreamDetails.Add(new CompareData(dataTypeIdKey, leftDataTypeId, rightDataTypeId));
            this.StreamDetails.Add(new CompareData(semanticIdKey, leftSemanticId, rightSemanticId));
            this.StreamDetails.Add(new CompareData(eventCountKey, leftEventCount, rightEventCount));
            this.StreamDetails.Add(new CompareData(startTimeKey, leftStartTime, rightStartTime));
            this.StreamDetails.Add(new CompareData(endTimeKey, leftEndTime, rightEndTime));

            bool sameDetails = this.StreamDetails.All(data => data.Same);

            this.StreamDetailsCompareText = string.Format(Strings.StreamDetailsHeader, sameDetails ? Strings.Same : Strings.Different);

            this.Same = (samePublicMetadata && samePersonalMetadata && sameDetails) ? true : false;
        }
Esempio n. 5
0
        /// <summary>
        /// Handles all command-line arguments
        /// </summary>
        /// <param name="args">Arguments array</param>
        /// <returns>CommandLineResult to indicate if the operation was successful or not</returns>
        private CommandLineResult ProcessCommandLine(string[] args)
        {
            string        logFile                        = string.Empty;
            List <string> streamList                     = new List <string>();
            bool          updatePersonalMetadata         = false;
            uint          loopCount                      = 0;
            Dictionary <string, List <string> > commands = new Dictionary <string, List <string> >();

            try
            {
                if (args == null)
                {
                    return(CommandLineResult.Succeeded);
                }

                if (args.Length == 0)
                {
                    return(CommandLineResult.Succeeded);
                }

                // gather commands and support parameters
                for (int i = 0; i < args.Length; i++)
                {
                    string arg = args[i];
                    if (this.IsArgument(arg))
                    {
                        string key = arg.Substring(1).ToUpperInvariant();

                        if (!commands.ContainsKey(key))
                        {
                            commands.Add(key, new List <string>());

                            for (int j = i + 1; j < args.Length; j++)
                            {
                                string param = args[j];
                                if (!this.IsArgument(param))
                                {
                                    commands[key].Add(param);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }

                // process all command args
                if (commands.ContainsKey("?") || commands.ContainsKey(Strings.Command_Help))
                {
                    this.RunCommandLine();
                    this.ShowCommandLineHelp();
                    return(CommandLineResult.SucceededExit);
                }

                // -log <filename>
                if (commands.ContainsKey(Strings.Command_Log))
                {
                    if (commands[Strings.Command_Log].Count != 1)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Log));
                        return(CommandLineResult.Invalid);
                    }

                    logFile = commands[Strings.Command_Log][0];
                }

                // -loop <count>
                if (commands.ContainsKey(Strings.Command_Loop))
                {
                    if (commands[Strings.Command_Loop].Count != 1)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Loop));
                        return(CommandLineResult.Invalid);
                    }

                    if (!uint.TryParse(commands[Strings.Command_Loop][0], out loopCount))
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Loop));
                        return(CommandLineResult.Invalid);
                    }
                }

                // -pii
                if (commands.ContainsKey(Strings.Command_PII))
                {
                    updatePersonalMetadata = true;
                }

                // -stream <stream1> <stream2> <stream3> ...
                if (commands.ContainsKey(Strings.Command_Stream))
                {
                    if (commands[Strings.Command_Stream].Count == 0)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Stream));
                        return(CommandLineResult.Invalid);
                    }

                    streamList = commands[Strings.Command_Stream];
                }

                // -view <filename>
                if (commands.ContainsKey(Strings.Command_View))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_View].Count != 1)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_View));
                        return(CommandLineResult.Invalid);
                    }

                    string fileInfo = string.Empty;
                    string filePath = commands[Strings.Command_View][0];
                    this.CheckFile(filePath);
                    Console.WriteLine(Strings.WaitForViewFile);

                    using (KStudioClient client = KStudio.CreateClient())
                    {
                        if (filePath.ToUpperInvariant().StartsWith(Strings.ConsoleClipRepository.ToUpperInvariant()))
                        {
                            client.ConnectToService();
                        }

                        using (KStudioEventFile eventFile = client.OpenEventFile(filePath))
                        {
                            FileData data = new FileData(eventFile);
                            fileInfo = data.GetFileDataAsText();
                            Console.WriteLine(fileInfo);
                        }
                    }

                    if (!string.IsNullOrEmpty(logFile))
                    {
                        Logger.Start(logFile, true);
                        Logger.Log(fileInfo);
                        Logger.Stop();
                    }

                    Console.WriteLine(Strings.Done);
                    return(CommandLineResult.SucceededExit);
                }

                // -compare <filename1> <filename2>
                if (commands.ContainsKey(Strings.Command_Compare))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Compare].Count != 2)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Compare));
                        return(CommandLineResult.Invalid);
                    }

                    string fileInfo = string.Empty;
                    string file1    = commands[Strings.Command_Compare][0];
                    string file2    = commands[Strings.Command_Compare][1];
                    this.CheckFile(file1);
                    this.CheckFile(file2);
                    Console.WriteLine(Strings.WaitForCompareFiles);

                    using (KStudioClient client = KStudio.CreateClient())
                    {
                        if (file1.ToUpperInvariant().StartsWith(Strings.ConsoleClipRepository.ToUpperInvariant()) || file2.ToUpperInvariant().StartsWith(Strings.ConsoleClipRepository.ToUpperInvariant()))
                        {
                            client.ConnectToService();
                        }

                        using (KStudioEventFile eventFile1 = client.OpenEventFile(file1))
                            using (KStudioEventFile eventFile2 = client.OpenEventFile(file2))
                            {
                                FileData        fileData1   = new FileData(eventFile1);
                                FileData        fileData2   = new FileData(eventFile2);
                                CompareFileData compareData = new CompareFileData(fileData1, fileData2);
                                fileInfo = compareData.GetCompareFileDataAsText();
                                Console.WriteLine(fileInfo);
                            }
                    }

                    if (!string.IsNullOrEmpty(logFile))
                    {
                        Logger.Start(logFile, true);
                        Logger.Log(fileInfo);
                        Logger.Stop();
                    }

                    Console.WriteLine(Strings.Done);
                    return(CommandLineResult.SucceededExit);
                }

                // -update <filename> <metadata key> <metadata value>
                if (commands.ContainsKey(Strings.Command_Update))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Update].Count != 3)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Update));
                        return(CommandLineResult.Invalid);
                    }

                    string filePath = commands[Strings.Command_Update][0];
                    string key      = commands[Strings.Command_Update][1];
                    object value    = commands[Strings.Command_Update][2];
                    this.CheckFile(filePath);
                    string metadataText = string.Empty;

                    if (streamList.Count > 0)
                    {
                        // update stream metadata
                        foreach (string streamName in streamList)
                        {
                            Console.WriteLine(string.Format(CultureInfo.CurrentCulture, Strings.UpdatingStreamMetadata, streamName));
                            metadataText = this.EditMetadata(filePath, key, value, streamName, updatePersonalMetadata, true);
                            Console.WriteLine(metadataText);
                        }
                    }
                    else
                    {
                        // update file metadata
                        Console.WriteLine(Strings.UpdatingFileMetadata);
                        metadataText = this.EditMetadata(filePath, key, value, string.Empty, updatePersonalMetadata, false);
                        Console.WriteLine(metadataText);
                    }

                    Console.WriteLine(Strings.Done);
                    return(CommandLineResult.SucceededExit);
                }

                // -remove <filename> <metadata key>
                if (commands.ContainsKey(Strings.Command_Remove))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Remove].Count != 2)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Remove));
                        return(CommandLineResult.Invalid);
                    }

                    string filePath = commands[Strings.Command_Remove][0];
                    string key      = commands[Strings.Command_Remove][1];
                    this.CheckFile(filePath);
                    string metadataText = string.Empty;

                    if (streamList.Count > 0)
                    {
                        // update stream metadata
                        foreach (string streamName in streamList)
                        {
                            Console.WriteLine(string.Format(CultureInfo.CurrentCulture, Strings.UpdatingStreamMetadata, streamName));
                            metadataText = this.EditMetadata(filePath, key, null, streamName, updatePersonalMetadata, true);
                            Console.WriteLine(metadataText);
                        }
                    }
                    else
                    {
                        // update file metadata
                        Console.WriteLine(Strings.UpdatingFileMetadata);
                        metadataText = this.EditMetadata(filePath, key, null, string.Empty, updatePersonalMetadata, false);
                        Console.WriteLine(metadataText);
                    }

                    Console.WriteLine(Strings.Done);
                    return(CommandLineResult.SucceededExit);
                }

                // -play <filename>
                if (commands.ContainsKey(Strings.Command_Play))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Play].Count != 1)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Play));
                        return(CommandLineResult.Invalid);
                    }

                    string filePath = commands[Strings.Command_Play][0];
                    this.CheckFile(filePath);

                    using (KStudioClient client = KStudio.CreateClient())
                    {
                        Console.WriteLine(Strings.WaitToConnect);
                        client.ConnectToService();

                        Console.WriteLine(Strings.StartPlayback);
                        Playback.PlaybackClip(client, filePath, streamList, loopCount);
                        Console.WriteLine(Strings.StopPlayback);

                        client.DisconnectFromService();
                    }

                    Console.WriteLine(Strings.Done);
                    return(CommandLineResult.SucceededExit);
                }

                // -record <filename> <duration>
                if (commands.ContainsKey(Strings.Command_Record))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Record].Count != 2)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Record));
                        return(CommandLineResult.Invalid);
                    }

                    string filePath = commands[Strings.Command_Record][0];
                    this.CheckDirectory(filePath);

                    double time = 0;
                    if (!double.TryParse(commands[Strings.Command_Record][1], out time))
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Record));
                        return(CommandLineResult.Invalid);
                    }

                    TimeSpan duration = TimeSpan.FromSeconds(time);
                    string   errorMsg = string.Empty;
                    string   fileInfo = string.Empty;

                    using (KStudioClient client = KStudio.CreateClient())
                    {
                        Console.WriteLine(Strings.WaitToConnect);
                        client.ConnectToService();

                        Console.WriteLine(Strings.StartRecording);
                        Recording.RecordClip(client, filePath, duration, streamList);
                        Console.WriteLine(Strings.StopRecording);

                        using (KStudioEventFile eventFile = client.OpenEventFile(filePath))
                        {
                            FileData fileData = new FileData(eventFile);
                            fileInfo = fileData.GetFileDataAsText();
                            Console.WriteLine(fileInfo);
                        }

                        client.DisconnectFromService();
                    }

                    if (!string.IsNullOrEmpty(logFile))
                    {
                        Logger.Start(logFile, true);
                        Logger.Log(fileInfo);
                        Logger.Stop();
                    }

                    Console.WriteLine(Strings.Done);
                    return(CommandLineResult.SucceededExit);
                }
            }
            catch (Exception ex)
            {
                string errorMsg = string.Format(Strings.ErrorPrepend, ex.Message);
                Console.Error.WriteLine(errorMsg);
                return(CommandLineResult.Failed);
            }

            return(CommandLineResult.Invalid);
        }
Esempio n. 6
0
        /// <summary>
        /// Handles all command-line arguments
        /// </summary>
        /// <param name="args">Arguments array</param>
        /// <returns>CommandLineResult to indicate if the operation was successful or not</returns>
        private CommandLineResult ProcessCommandLine(string[] args)
        {
            string logFile = string.Empty;
            List<string> streamList = new List<string>();
            bool updatePersonalMetadata = false;
            uint loopCount = 0;
            Dictionary<string, List<string>> commands = new Dictionary<string, List<string>>();

            try
            {
                if (args == null)
                {
                    return CommandLineResult.Succeeded;
                }

                if (args.Length == 0)
                {
                    return CommandLineResult.Succeeded;
                }

                // gather commands and support parameters
                for (int i = 0; i < args.Length; i++)
                {
                    string arg = args[i];
                    if (this.IsArgument(arg))
                    {
                        string key = arg.Substring(1).ToUpperInvariant();

                        if (!commands.ContainsKey(key))
                        {
                            commands.Add(key, new List<string>());

                            for (int j = i + 1; j < args.Length; j++)
                            {
                                string param = args[j];
                                if (!this.IsArgument(param))
                                {
                                    commands[key].Add(param);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }

                // process all command args
                if (commands.ContainsKey("?") || commands.ContainsKey(Strings.Command_Help))
                {
                    this.RunCommandLine();
                    this.ShowCommandLineHelp();
                    return CommandLineResult.SucceededExit;
                }

                // -log <filename>
                if (commands.ContainsKey(Strings.Command_Log))
                {
                    if (commands[Strings.Command_Log].Count != 1)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Log));
                        return CommandLineResult.Invalid;
                    }

                    logFile = commands[Strings.Command_Log][0];
                }

                // -loop <count>
                if (commands.ContainsKey(Strings.Command_Loop))
                {
                    if (commands[Strings.Command_Loop].Count != 1)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Loop));
                        return CommandLineResult.Invalid;
                    }

                    if (!uint.TryParse(commands[Strings.Command_Loop][0], out loopCount))
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Loop));
                        return CommandLineResult.Invalid;
                    }
                }

                // -pii
                if (commands.ContainsKey(Strings.Command_PII))
                {
                    updatePersonalMetadata = true;
                }

                // -stream <stream1> <stream2> <stream3> ...
                if (commands.ContainsKey(Strings.Command_Stream))
                {
                    if (commands[Strings.Command_Stream].Count == 0)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Stream));
                        return CommandLineResult.Invalid;
                    }

                    streamList = commands[Strings.Command_Stream];
                }

                // -view <filename>
                if (commands.ContainsKey(Strings.Command_View))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_View].Count != 1)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_View));
                        return CommandLineResult.Invalid;
                    }

                    string fileInfo = string.Empty;
                    string filePath = commands[Strings.Command_View][0];
                    this.CheckFile(filePath);
                    Console.WriteLine(Strings.WaitForViewFile);

                    using (KStudioClient client = KStudio.CreateClient())
                    {
                        if (filePath.ToUpperInvariant().StartsWith(Strings.ConsoleClipRepository.ToUpperInvariant()))
                        {
                            client.ConnectToService();
                        }

                        using (KStudioEventFile eventFile = client.OpenEventFile(filePath))
                        {
                            FileData data = new FileData(eventFile);
                            fileInfo = data.GetFileDataAsText();
                            Console.WriteLine(fileInfo);
                        }
                    }

                    if (!string.IsNullOrEmpty(logFile))
                    {
                        Logger.Start(logFile, true);
                        Logger.Log(fileInfo);
                        Logger.Stop();
                    }

                    Console.WriteLine(Strings.Done);
                    return CommandLineResult.SucceededExit;
                }

                // -compare <filename1> <filename2>
                if (commands.ContainsKey(Strings.Command_Compare))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Compare].Count != 2)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Compare));
                        return CommandLineResult.Invalid;
                    }

                    string fileInfo = string.Empty;
                    string file1 = commands[Strings.Command_Compare][0];
                    string file2 = commands[Strings.Command_Compare][1];
                    this.CheckFile(file1);
                    this.CheckFile(file2);
                    Console.WriteLine(Strings.WaitForCompareFiles);

                    using (KStudioClient client = KStudio.CreateClient())
                    {
                        if (file1.ToUpperInvariant().StartsWith(Strings.ConsoleClipRepository.ToUpperInvariant()) || file2.ToUpperInvariant().StartsWith(Strings.ConsoleClipRepository.ToUpperInvariant()))
                        {
                            client.ConnectToService();
                        }

                        using (KStudioEventFile eventFile1 = client.OpenEventFile(file1))
                        using (KStudioEventFile eventFile2 = client.OpenEventFile(file2))
                        {
                            FileData fileData1 = new FileData(eventFile1);
                            FileData fileData2 = new FileData(eventFile2);
                            CompareFileData compareData = new CompareFileData(fileData1, fileData2);
                            fileInfo = compareData.GetCompareFileDataAsText();
                            Console.WriteLine(fileInfo);
                        }
                    }

                    if (!string.IsNullOrEmpty(logFile))
                    {
                        Logger.Start(logFile, true);
                        Logger.Log(fileInfo);
                        Logger.Stop();
                    }

                    Console.WriteLine(Strings.Done);
                    return CommandLineResult.SucceededExit;
                }

                // -update <filename> <metadata key> <metadata value>
                if (commands.ContainsKey(Strings.Command_Update))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Update].Count != 3)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Update));
                        return CommandLineResult.Invalid;
                    }

                    string filePath = commands[Strings.Command_Update][0];
                    string key = commands[Strings.Command_Update][1];
                    object value = commands[Strings.Command_Update][2];
                    this.CheckFile(filePath);
                    string metadataText = string.Empty;

                    if (streamList.Count > 0)
                    {
                        // update stream metadata
                        foreach (string streamName in streamList)
                        {
                            Console.WriteLine(string.Format(CultureInfo.CurrentCulture, Strings.UpdatingStreamMetadata, streamName));
                            metadataText = this.EditMetadata(filePath, key, value, streamName, updatePersonalMetadata, true);
                            Console.WriteLine(metadataText);
                        }
                    }
                    else
                    {
                        // update file metadata
                        Console.WriteLine(Strings.UpdatingFileMetadata);
                        metadataText = this.EditMetadata(filePath, key, value, string.Empty, updatePersonalMetadata, false);
                        Console.WriteLine(metadataText);
                    }

                    Console.WriteLine(Strings.Done);
                    return CommandLineResult.SucceededExit;
                }

                // -remove <filename> <metadata key>
                if (commands.ContainsKey(Strings.Command_Remove))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Remove].Count != 2)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Remove));
                        return CommandLineResult.Invalid;
                    }

                    string filePath = commands[Strings.Command_Remove][0];
                    string key = commands[Strings.Command_Remove][1];
                    this.CheckFile(filePath);
                    string metadataText = string.Empty;

                    if (streamList.Count > 0)
                    {
                        // update stream metadata
                        foreach (string streamName in streamList)
                        {
                            Console.WriteLine(string.Format(CultureInfo.CurrentCulture, Strings.UpdatingStreamMetadata, streamName));
                            metadataText = this.EditMetadata(filePath, key, null, streamName, updatePersonalMetadata, true);
                            Console.WriteLine(metadataText);
                        }
                    }
                    else
                    {
                        // update file metadata
                        Console.WriteLine(Strings.UpdatingFileMetadata);
                        metadataText = this.EditMetadata(filePath, key, null, string.Empty, updatePersonalMetadata, false);
                        Console.WriteLine(metadataText);
                    }

                    Console.WriteLine(Strings.Done);
                    return CommandLineResult.SucceededExit;
                }

                // -play <filename>
                if (commands.ContainsKey(Strings.Command_Play))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Play].Count != 1)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Play));
                        return CommandLineResult.Invalid;
                    }

                    string filePath = commands[Strings.Command_Play][0];
                    this.CheckFile(filePath);

                    using (KStudioClient client = KStudio.CreateClient())
                    {
                        Console.WriteLine(Strings.WaitToConnect);
                        client.ConnectToService();

                        Console.WriteLine(Strings.StartPlayback);
                        Playback.PlaybackClip(client, filePath, streamList, loopCount);
                        Console.WriteLine(Strings.StopPlayback);

                        client.DisconnectFromService();
                    }

                    Console.WriteLine(Strings.Done);
                    return CommandLineResult.SucceededExit;
                }

                // -record <filename> <duration>
                if (commands.ContainsKey(Strings.Command_Record))
                {
                    this.RunCommandLine();
                    if (commands[Strings.Command_Record].Count != 2)
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Record));
                        return CommandLineResult.Invalid;
                    }

                    string filePath = commands[Strings.Command_Record][0];
                    this.CheckDirectory(filePath);

                    double time = 0;
                    if (!double.TryParse(commands[Strings.Command_Record][1], out time))
                    {
                        Console.Error.WriteLine(string.Format(Strings.ErrorInvalidArgs, Strings.Command_Record));
                        return CommandLineResult.Invalid;
                    }

                    TimeSpan duration = TimeSpan.FromSeconds(time);
                    string errorMsg = string.Empty;
                    string fileInfo = string.Empty;

                    using (KStudioClient client = KStudio.CreateClient())
                    {
                        Console.WriteLine(Strings.WaitToConnect);
                        client.ConnectToService();

                        Console.WriteLine(Strings.StartRecording);
                        Recording.RecordClip(client, filePath, duration, streamList);
                        Console.WriteLine(Strings.StopRecording);

                        using (KStudioEventFile eventFile = client.OpenEventFile(filePath))
                        {
                            FileData fileData = new FileData(eventFile);
                            fileInfo = fileData.GetFileDataAsText();
                            Console.WriteLine(fileInfo);
                        }

                        client.DisconnectFromService();
                    }

                    if (!string.IsNullOrEmpty(logFile))
                    {
                        Logger.Start(logFile, true);
                        Logger.Log(fileInfo);
                        Logger.Stop();
                    }

                    Console.WriteLine(Strings.Done);
                    return CommandLineResult.SucceededExit;
                }
            }
            catch (Exception ex)
            {
                string errorMsg = string.Format(Strings.ErrorPrepend, ex.Message);
                Console.Error.WriteLine(errorMsg);
                return CommandLineResult.Failed;
            }

            return CommandLineResult.Invalid;
        }