public static IDictionary <string, SalesforceDataType> GetFieldsFromReport(QvxConnection connection, string reportID)
        {
            IDictionary <string, string> connectionParams = GetParamsFromConnection(connection);

            if (connectionParams == null)
            {
                return(new Dictionary <string, SalesforceDataType>());
            }

            return(ValidateAccessTokenAndPerformRequest(connection,
                                                        connectionParams,
                                                        accessToken =>
            {
                Uri hostUri = new Uri(connectionParams[QvxSalesforceConnectionInfo.CONNECTION_HOST]);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(hostUri,
                                                                                   "/services/data/" + QvxSalesforceConnectionInfo.SALESFORCE_API_VERSION + "/analytics/reports/" + reportID + "/describe"));
                request.Method = "GET";
                WebHeaderCollection headers = new WebHeaderCollection();
                headers.Add("Authorization", "Bearer " + accessToken);
                request.Headers = headers;

                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (Stream stream = response.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                        string responseString = reader.ReadToEnd();
                        JObject jsonResponse = JObject.Parse(responseString);

                        JToken columnArray = jsonResponse["reportExtendedMetadata"]["detailColumnInfo"];
                        IDictionary <string, SalesforceDataType> columns = columnArray.ToDictionary(c => c.First["label"].Value <string>(),
                                                                                                    t =>
                        {
                            SalesforceDataType columnType = SalesforceDataType.String;
                            switch (t.First["dataType"].Value <string>())
                            {
                            case "string":
                                columnType = SalesforceDataType.String;
                                break;

                            case "int":
                                columnType = SalesforceDataType.Integer;
                                break;

                            case "double":
                                columnType = SalesforceDataType.Double;
                                break;

                            case "boolean":
                                columnType = SalesforceDataType.Boolean;
                                break;

                            case "percent":
                                columnType = SalesforceDataType.Percent;
                                break;

                            case "date":
                                columnType = SalesforceDataType.Date;
                                break;

                            case "datetime":
                                columnType = SalesforceDataType.DateTime;
                                break;

                            case "currency":
                                columnType = SalesforceDataType.Currency;
                                break;
                            }
                            return columnType;
                        });
                        return columns;
                    }
                }
            }));
        }
 public void SetFieldValue(int index, QvxField field, SalesforceDataType attribType)
 {
     Fields[index]     = field;
     FieldTypes[index] = attribType;
 }