public override FindMetadataResultList GetMetadataSearchResults(string SearchToken, int MinResults, [System.Xml.Serialization.XmlIgnoreAttribute()] bool MinResultsSpecified, int MaxResults, [System.Xml.Serialization.XmlIgnoreAttribute()] bool MaxResultsSpecified, [System.Xml.Serialization.XmlElementAttribute(DataType = "duration")] string WaitTime)
        {
            RecordingEntitiesSearchSession session = SearchSessionManager.Instance.GetSession(SearchToken) as RecordingEntitiesSearchSession;

            if (session != null)
            {
                List <FindMetadataResult> data = (List <FindMetadataResult>)session.Data;

                FindMetadataResultList list = new FindMetadataResultList();

                Random rnd = new Random();
                int    cnt = Math.Min(rnd.Next(1, 4), data.Count);

                rnd = new Random();
                int sleep = rnd.Next(1, 3);
                System.Threading.Thread.Sleep(400 * sleep + 450);

                list.Result = new FindMetadataResult[cnt];
                for (int i = 0; i < cnt; i++)
                {
                    list.Result[i] = data[0];
                    data.RemoveAt(0);
                }
                session.ResultsSent = session.ResultsSent + cnt;
                list.SearchState    = data.Count > 0 ? SearchState.Searching : SearchState.Completed;

                if (data.Count == 0)
                {
                    SearchSessionManager.Instance.Sessions.Remove(session);
                }
                return(list);
            }
            else
            {
                CommonUtils.ReturnFault(new string[] { "Sender", "InvalidArgVal", "InvalidToken" });
                return(null);
            }
        }
        public override string FindMetadata(System.DateTime StartPoint,
                                            System.DateTime EndPoint,
                                            [System.Xml.Serialization.XmlIgnoreAttribute()] bool EndPointSpecified,
                                            SearchScope Scope,
                                            MetadataFilter MetadataFilter,
                                            int MaxMatches,
                                            [System.Xml.Serialization.XmlIgnoreAttribute()] bool MaxMatchesSpecified,
                                            [System.Xml.Serialization.XmlElementAttribute(DataType = "duration")] string KeepAliveTime)
        {
            string token = SearchSessionManager.Instance.GetNextToken();

            int    keepAliveTime = 0;
            string strKeepAlive  = KeepAliveTime.Substring(2, KeepAliveTime.Length - 3);

            keepAliveTime = int.Parse(strKeepAlive);
            if (KeepAliveTime.EndsWith("M"))
            {
                keepAliveTime = keepAliveTime * 60;
            }

            RecordingEntitiesSearchSession session = new RecordingEntitiesSearchSession()
            {
                KeepAlive   = keepAliveTime,
                Token       = token,
                Started     = System.DateTime.Now,
                LastRequest = System.DateTime.Now,
            };

            if (MaxMatchesSpecified)
            {
                session.MaxMatches = MaxMatches;
            }

            if (Scope != null && Scope.IncludedRecordings != null & Scope.IncludedRecordings.Length > 0)
            {
                session.RecordingToken = Scope.IncludedRecordings[0];
            }

            List <FindMetadataResult> resultsList = null;

            bool ascending = true;

            if (EndPointSpecified)
            {
                if (EndPoint < StartPoint)
                {
                    ascending = false;
                }
            }

            // to get different results from one search operation to another
            //SearchStorage.Instance.ClearMetadata();
            //SearchStorage.Instance.ChangeMetadataGeneration();

            IEnumerable <FindMetadataResult> filtered =
                SearchStorage.Instance.Metadata.Where(
                    E =>
                    E.RecordingToken == session.RecordingToken || string.IsNullOrEmpty(session.RecordingToken));


            if (ascending)
            {
                resultsList =
                    filtered.Where(E => (E.Time >= StartPoint &&
                                         (E.Time <= EndPoint || !EndPointSpecified))).OrderBy(E => E.Time).ToList();
            }
            else
            {
                resultsList =
                    filtered.Where(E => (E.Time <= StartPoint &&
                                         (E.Time >= EndPoint || !EndPointSpecified))).OrderByDescending(E => E.Time).ToList();
            }

            if (session.MaxMatches.HasValue)
            {
                int cnt = Math.Min(session.MaxMatches.Value, resultsList.Count);
                List <FindMetadataResult> corrected = new List <FindMetadataResult>();
                for (int i = 0; i < cnt; i++)
                {
                    corrected.Add(resultsList[i]);
                }
                session.Data = corrected;
            }
            else
            {
                session.Data = resultsList;
            }

            SearchSessionManager.Instance.Sessions.Add(session);
            return(token);
        }