private ParameterInfo findSystemParam(ParameterInfo[] parameterArray, RhspParameter rhspParam)
        {
            ParameterInfo param = null;

            foreach (ParameterInfo checkParam in parameterArray)
            {
                if (checkParam.Name == rhspParam.Name)
                {
                    param = checkParam;
                    break;
                }
            }
            return(param);
        }
        private bool methodHasParamName(MethodInfo method, RhspParameter rhspParam)
        {
            bool hasName = false;

            foreach (ParameterInfo systemParam in method.GetParameters())
            {
                if (systemParam.Name == rhspParam.Name)
                {
                    hasName = true;
                    break;
                }
            }
            return(hasName);
        }
        private RhspCommandResponse getCommandResponse(RhspCommandCarrier carrier)
        {
            RhspCommandResponse response = new RhspCommandResponse();

            string[] ctParts = carrier.Command.CommandText.Split('.');
            if (ctParts.Length != 2)
            {
                throw new RhspException(
                          "Unable to process command because it is not in " +
                          "the correct format (ModuleName.MethodName).");
            }

            string moduleName = ctParts[0];
            string methodName = ctParts[1];

            if (!moduleManagerTable.ContainsKey(moduleName))
            {
                throw new RhspException(
                          "Unable to process command because the module " +
                          "name '" + moduleName + "' was not recognised.");
            }

            Type managerType = moduleManagerTable[moduleName];

            RhspManager manager;

            if (managerType == typeof(HostingConfigManager))
            {
                // Ensure that only one hosting config is used.
                manager = service.Context.HostingConfig;
            }
            else if (managerType == typeof(ServerConfigManager))
            {
                // Ensure that only one server config is used.
                manager = service.Context.ServerConfig;
            }
            else
            {
                manager = RhspManager.CreateManager(
                    service.Context,
                    managerType);
            }

            MethodInfo methodInfo = getModuleMethod(
                manager,
                methodName,
                carrier.Command.Parameters);

            ParameterInfo[] systemParamArray = methodInfo.GetParameters();
            object[]        methodValueArray = new object[systemParamArray.Length];

            foreach (ParameterInfo systemParam in systemParamArray)
            {
                RhspParameter rhspParam = carrier.Command.Parameters[systemParam.Name];
                if (!systemParam.ParameterType.IsAssignableFrom(rhspParam.Value.GetType()))
                {
                    throw new RhspException(
                              "The data type '" + systemParam.ParameterType.Name + "' " +
                              "of system parameter with name '" + systemParam.Name + "' " +
                              "is not compatible with the equivilent command parameter " +
                              "of type '" + rhspParam.Value.GetType().Name + "'.");
                }

                // Assign the value to the correct position so it matches the signature.
                methodValueArray[systemParam.Position] = rhspParam.Value;
            }

            // Call method using manager so that apropriate events are fired.
            response.SetData(manager.InvokeMethod(methodInfo, methodValueArray));

            // Save both configs regardless of if changes have been made.
            // TODO: Only save if changes actually have been made.
            service.Context.HostingConfig.Save();
            service.Context.ServerConfig.Save();

            return(response);
        }