Citrix Storefront - Adventures in customization - Change any ICA parameter

31 Jul 2017

When I was originally exploring using the Citrix SDK to manipulate some ICA parameters, I found I couldn’t do it. Using Powershell and passing a header parameter I could manipulate the ICA file to how I wanted, but when I attempted to do so with Internet Explorer, I found it wasn’t passing the header parameter. I assumed this was because of how browsers were launching the ICA file. However, I attempted to use Sam Jacob’s Citrix Storefront clientname manipulation extension, I discovered I had the same problem. I originally thought I was doing something wrong, but on a whim I tried Chrome and it worked… Perfectly!

When I investigated further I found it appears that when Storefront detects IE it doesn’t use the GetLaunchStatus API, which passes the headers to Storefront for ICA manipulation. I found a way to fix this was the add the IE detection to the script.js and add the missing call to the GetLaunchStatus API.

But now that I have headers being passed properly, I thought I should revisit my ICA parameter manipulation. Sam’s customization works great for manipulating the client name, but we have a few applications with various different requirements:

  1. Pass parameters to some specific applications
  2. Modify clientname based on the specific application that is launched

Can we replace Sam’s customization with one that can manipulate any ICA parameter we so choose?

Yes. Yes we can. Storefront is very nice, flexible and powerful

I’ve designed this customization to look for an additional app setting tag. This needs to be added to the web.config at the ““C:\inetpub\wwwroot\Citrix\Store\web.config”” level:

<appSettings>
  <add key="modifyICAProperties" value="true" />
  </appSettings>

Any parameter you want passed through needs to be enabled as a forwarded header in the ““C:\inetpub\wwwroot\Citrix\StoreWeb\web.config”” file:

<communication attempts="1" timeout="00:03:00" loopback="Off"
          loopbackPortUsingHttp="80">
          <proxy enabled="true" processName="Fiddler" port="8888" />
          <forwardedHeaders>
			<header name="ClientName" />
			<header name="LongCommandLine" />
          </forwardedHeaders>
        </communication>

 

Lastly, you need to edit your \custom\script.js file to include your application and whatever parameters you want passed to it:

CTXS.Extensions.doLaunch =  function(app, action) {
	//check for Notepad and configure clientname
	if (app.name == "Notepad - 2012") {
		$.ajaxSetup({
			headers : {
				'ClientName':'HappyHappyJoyJoy',
				'LongCommandLine':'"C:\\Windows\\DtcInstall.log"'
			}
		});
	}
	//fix for IE not executing GetLaunchStatus which is required to pass headers to our ICA file.
	if (CTXS.Device.isIE()) {
		app.launchstatusurl || (app.launchstatusurl = app.launchurl.replace("/LaunchIca/", "/GetLaunchStatus/").replace("/Launch/", "/GetLaunchStatus/"));
		var e = CTXS.ClientManager.getLaunchMethod() == CTXS.LaunchMethod.PROTOCOL_HANDLER;
		CTXS.ResourcesClient.getLaunchStatus(app, e)
	}
    action();
	delete $.ajaxSettings.headers["ClientName"]; //Remove header
	delete $.ajaxSettings.headers["LongCommandLine"]; //Remove header
};

One of the cool things about this is you can still use tags to change the behaviour of these applications. For instance, if you want a certain subset of your applications to be 8bit you can do set check for that tag on app launch and add the header to set the desired color. You can set certain applications to keep their ICA file by setting “RemoveICAFile” to Off. You can individually modify any setting for a specific application or subset of applications.

Here is the StoreCustomization_Launch.dll and source code.

Here is the source code for prosperity:

/*************************************************************************
*
* Copyright (c) 2013-2015 Citrix Systems, Inc. All Rights Reserved.
* You may only reproduce, distribute, perform, display, or prepare derivative works of this file pursuant to a valid license from Citrix.
*
* THIS SAMPLE CODE IS PROVIDED BY CITRIX "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
*
* Modified by Trentent Tye for ICA settings manipulation.
* 
* 
*************************************************************************/

using System.Configuration;
using System.Collections.Specialized;
using Citrix.DeliveryServices.ResourcesCommon.Customization.Contract;
using Examples.Helpers;

namespace StoreCustomization_Launch
{
    // It is not necessary to implement both ILaunchResultModifier and IHdxRoutingModifier if only customizing
    // the ICA file generation or only customizing the HDX Routing customization.
    public class LaunchResultModifier : ILaunchResultModifier
    {
        public bool RunExtendedValidation { get { return false; } }
        public bool ReturnOriginalValueOnFailure { get { return false; } }

        #region ICA File customization

        public string Modify(string valueToModify, CustomizationContextData context)
        {
            var icadetails = new IcaFile(valueToModify);
            Tracer.TraceInfo("Resource SDK: Launch customization point: ICA file modification");
            string modifyICAProperties = ConfigurationManager.AppSettings["modifyICAProperties"];
            if (modifyICAProperties == "true")
            {
                Tracer.TraceInfo("Modify ICA Properties");
                // ICA Settings were gotten from https://docs.citrix.com/content/dam/docs/en-us/receiver/windows/ica-settings/en.ica-settings.ica-settings-wrapper.pdf

                var Headers = context.HttpContext.Request.Headers;
                foreach (string header in Headers)
                {
                    switch (header)
                    {
                        case "AcceptURLType":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Address":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AECD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AllowAudioInput":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AllowVirtualDriverEx":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AllowVirtualDriverExLegacy":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AltProxyAutoConfigURL":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AltProxyBypassList":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AltProxyHost":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AltProxyPassword":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AltProxyType":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AlwaysSendPrintScreen":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AppendUsername":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AudioBandwidthLimit":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AudioDevice":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AudioDuringDetach":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AudioHWSection":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AudioInWakeOnInput":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AudioOutWakeOnOutput":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AUTHPassword":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AUTHUserName":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "AutoLogonAllowed":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "BrowserProtocol":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "BrowserRetry":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "BrowserTimeout":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "BUCC":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "BufferLength":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "BufferLength2":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "BypassSmartcardDomain":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "BypassSmartcardPassword":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "BypassSmartcardUsername":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CbChainInterval":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CDMAllowed":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CDMReadOnly":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CFDCD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CGPAddress":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CGPSecurityTicket":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ChannelName":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ClearPassword":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ClientAudio":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ClientName":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ClipboardAllowed":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "COCD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ColorMismatchPrompt_Have16_Want256":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ColorMismatchPrompt_Have16M_Want256":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ColorMismatchPrompt_Have64k_Want256":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "COMAllowed":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Command":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CommandAckThresh":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CommPollSize":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CommPollWaitInc":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CommPollWaitIncTime":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CommPollWaitMax":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CommPollWaitMin":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CommWakeOnInput":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ConnectionBar":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ConnectionFriendlyName":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ContentRedirectionScheme":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ControlPollTime":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ConverterSection":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CPMAllowed":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRBrowserAcceptURLtype":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRBrowserCommand":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRBrowserPath":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRBrowserPercentS":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRBrowserRejectURLtype":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CREnabled":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRPlayerAcceptURLtype":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRPlayerCommand":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRPlayerPath":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRPlayerPercentS":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "CRPlayerRejectURLtype":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DataAckThresh":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DataBits":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DefaultHttpBrowserAddress":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DeferredUpdateMode":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DesiredColor":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DesiredHRES":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DesiredVRES":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DeviceName":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DisableCtrlAltDel":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DisableDrives":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DisableMMMaximizeSupport":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DisableSound":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DisableUPDOptimizationFlag":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Domain":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DriverNameAlt":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DriverNameAltWin32":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DriverNameWin32":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DTR":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "DynamicCDM":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EmulateMiddleMouseButton":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EmulateMiddleMouseButtonDelay":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableAsyncWrites":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableAudioInput":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableClientSelectiveTrust":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableInputLanguageToggle":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableOSS":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableReadAhead":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableRtpAudio":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableSessionSharing":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableSessionSharingClient":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableSessionSharingHost":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EnableSSOThruICAFile":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "EncryptionLevelSession":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "endIFDCD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "FONTSMOOTHINGTYPE":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ForceLVBMode":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "FriendlyName":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "FullScreenBehindLocalTaskbar":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "FullScreenOnly":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HDXoverUDP":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey10Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey10Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey1Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey1Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey2Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey2Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey3Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey3Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey4Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey4Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey5Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey5Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey6Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey6Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey7Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey7Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey8Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey8Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey9Char":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HotKey9Shift":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HowManySkipRedrawPerPaletteChange":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "HttpBrowserAddress":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ICAHttpBrowserAddress":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ICAKeepAliveEnabled":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ICAKeepAliveInterval":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ICAPortNumber":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ICAPrntScrnKey":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ICASOCKSProtocolVersion":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ICASOCKSProxyHost":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ICASOCKSProxyPortNumber":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "InitialProgram":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "InputEncoding":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "InstallColormap":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "IOBase":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "KeyboardLayout":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "KeyboardSendLocale":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "KeyboardTimer":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "KeyboardType":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Launcher":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LaunchReference":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LicenseType":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LocalIME":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LocHttpBrowserAddress":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LockdownProfiles":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogAppend":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogConfigurationAccess":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogConnect":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogErrors":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogEvidence":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogFile":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogFileGlobalPath":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogFileWin32":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogFlush":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogonTicket":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LogonTicketType":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LongCommandLine":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Lpt1":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Lpt2":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Lpt3":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LPWD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "LvbMode2":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MaxDataBufferSize":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MaxMicBufferSize":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MaxOpenContext":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MaxPort":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MaxWindowSize":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MinimizeOwnedWindows":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MissedKeepaliveWarningMsg":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MissedKeepaliveWarningTime":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MouseTimer":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MouseWheelMapping":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "MSIEnabled":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "NativeDriveMapping":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "NDS":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "NRUserName":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "NRWD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "NumCommandBuffers":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "NumDataBuffers":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "OutBufCountClient":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "OutBufCountClient2":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "OutBufCountHost":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "OutBufCountHost2":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "OutBufLength":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PassThroughLogoff":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Password":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Path":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PCSCCodePage":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PCSCLibraryName":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PercentS":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PersistentCacheEnabled":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PersistentCacheGlobalPath":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PersistentCacheMinBitmap":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PersistentCachePath":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PersistentCachePercent":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PersistentCacheSize":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PersistentCacheUsrRelPath":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PingCount":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PlaybackDelayThresh":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PNPDeviceAllowed":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "pnStartSCD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Port1":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Port2":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "POSDeviceAllowed":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PrinterFlowControl":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PrinterResetTime":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PrinterThreadPriority":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "PrintMaxRetry":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyAuthenticationBasic":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyAuthenticationKerberos":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyAuthenticationNTLM":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyAuthenticationPrompt":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyAutoConfigURL":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyBypassList":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyFallback":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyFavorIEConnectionSetting":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyHost":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyPassword":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyPort":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyTimeout":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyType":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyUseDefault":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyUseFQDN":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ProxyUsername":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ReadersStatusPollPeriod":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "RECD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "RegionIdentification":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "RejectURLType":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "RemoveICAFile":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ResMngrRunningPollPeriod":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "REWD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "RtpAudioHighestPort":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "RtpAudioLowestPort":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ScalingHeight":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ScalingMode":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ScalingPercent":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ScalingWidth":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Schedule":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ScreenPercent":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SecureChannelProtocol":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SessionReliabilityTTL":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SessionSharingKey":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SessionSharingLaunchOnly":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SFRAllowed":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SkipRedrawPerPaletteChange":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SmartCardAllowed":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SpeedScreenMMA":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SpeedScreenMMAAudioEnabled":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SpeedScreenMMAMaxBufferThreshold":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SpeedScreenMMAMaximumBufferSize":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SpeedScreenMMAMinBufferThreshold":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SpeedScreenMMASecondsToBuffer":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SpeedScreenMMAVideoEnabled":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSLCACert":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSLCertificateRevocationCheckPolicy":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSLCiphers":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSLCommonName":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSLEnable":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSLProxyHost":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSOnCredentialType":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSOnDetected":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSOnUserSetting":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SSPIEnabled":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "startIFDCD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "startSCD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "State":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SucConnTimeout":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "SwapButtons":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TransparentKeyPassthrough":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TransportReconnectDelay":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TransportReconnectEnabled":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TransportReconnectRetries":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TRWD":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Tw2CachePower":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TW2StopwatchMinimum":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TW2StopwatchScale":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TwainAllowed":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TWIEmulateSystray":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TWIFullScreenMode":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TWIIgnoreWorkArea":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TWIMode":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TWISeamlessFlag":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TWIShrinkWorkArea":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TWISuppressZZEcho":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "TWITaskbarGroupingMode":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "UnicodeEnabled":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "UseAlternateAddress":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "UseDefaultEncryption":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "UseLocalUserAndPassword":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "UseMRUBrowserPrefs":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Username":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "UserOverride":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "UsersShareIniFiles":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "UseSSPIOnly":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "VariantName":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "VirtualChannels":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "VirtualCOMPortEmulation":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "VirtualDriver":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "VirtualDriverEx":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "VSLAllowed":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "Win32FavorRetainedPrinterSettings":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "WindowManagerMoveIgnored":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "WindowManagerMoveTimeout":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "WindowsCache":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "WindowSize":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "WindowSize2":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "WindowsPrinter":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "WorkDirectory":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "WpadHost":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "XmlAddressResolutionType":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ZLAutoHiLimit":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ZLAutoLowLimit":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ZLDiskCacheSize":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ZLFntMemCacheSize":
                            icadetails.SetPropertyValue("WFClient", header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ZLKeyboardMode":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        case "ZLMouseMode":
                            icadetails.SetPropertyValue(IcaFile.ApplicationSection, header, GetHeaderValueFromContext(context, header));
                            break;
                        default:
                            Tracer.TraceInfo("Completed ICA file modification");
                            break;
                    }

                }
            }
            else
                Tracer.TraceError("Modify ICA Properties: No rule supplied");


            // get modified string back from helper breakdown class.
            string modifiedIcaFile = icadetails.ToString();

            //return the result
            return modifiedIcaFile;
        }

        // utility fn: return the set of values associated with a given header, in a single string joined by ';'s
        // returns null if header is not found in context
        private static string GetHeaderValueFromContext(CustomizationContextData context, string headerName)
        {
            NameValueCollection reqHeads = context.HttpContext.Request.Headers;
            string targetH = headerName.ToLower();
            string values = "";
            bool found = false;
            foreach (string hr in reqHeads.AllKeys)
            {
                if (hr.ToLower() == targetH)
                {
                    found = true;
                    int h = 0;
                    foreach (string hval in reqHeads.GetValues(hr))
                    {
                        if (h++ > 1)
                        {
                            values += ";";
                        }
                        values += hval;
                    }
                }
            }
            if (!found)
                return null;

            return values;
        }
        #endregion
    }
}