﻿<%@ ServiceHost Language="C#" Debug="true" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
    Service="DataJS.Tests.Instrument" %>

// Copyright (c) Microsoft Open Technologies, Inc.  All rights reserved.
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 
// files (the "Software"), to deal  in the Software without restriction, including without limitation the rights  to use, copy,
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the 
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY,  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

namespace DataJS.Tests
{
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Syndication;
    using System.ServiceModel.Web;
    using System.Text;

    /// <summary>
    /// Instrumentation utilities
    /// </summary>
    [ServiceContract]
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Instrument
    {
        static readonly Dictionary<string, string> userAgents = new Dictionary<string,string>
        {
            { "MSIE", "iexplore" },
            { "Firefox", "firefox" },
            { "Chrome", "chrome" },
            { "Safari", "safari" }
        };
        
        /// <summary>
        /// Gets the memory size used by the browser
        /// </summary>
        /// <returns>The memory size used by the browser (in bytes), or zero if browser is not supported</returns>
        [OperationContract]
        [WebGet]
        public Stream GetBrowserMemorySize()
        {
            string userAgentString = WebOperationContext.Current.IncomingRequest.UserAgent;
            string userAgentKey = Instrument.userAgents.Keys.FirstOrDefault(ua => userAgentString.Contains(ua));

            if (userAgentKey != null)
            {
                string processName = userAgents[userAgentKey];
                long totalMemory = Process.GetProcessesByName(processName).Select(p => p.WorkingSet64).Sum();
                
                return new MemoryStream(Encoding.UTF8.GetBytes(totalMemory.ToString()));
            }
            else
            {
                return new MemoryStream(Encoding.UTF8.GetBytes("0"));
            }
        }
    }
}