private void UpdateResponse(DataServiceResponseData responseData, DescriptorData descriptor, HttpResponseData response) { var operationResponse = new ChangeOperationResponseData(descriptor); operationResponse.StatusCode = (int)response.StatusCode; foreach (var header in response.Headers) { operationResponse.Headers.Add(header.Key, header.Value); } responseData.Add(operationResponse); }
/// <summary> /// Calculates the expected response from DataServiceContext.SaveChanges based on the context data before saving changes. /// Assumes there are no errors in the response. /// </summary> /// <param name="dataBeforeSaveChanges">The data before saving changes.</param> /// <param name="options">The options for saving changes.</param> /// <param name="context">The DataServiceContext instance which is calling SaveChanges.</param> /// <returns><see cref="DataServiceResponseData"/> that expresses expectations for the response.</returns> public DataServiceResponseData CalculateSaveChangesResponseData(DataServiceContextData dataBeforeSaveChanges, SaveChangesOptions options, DSClient.DataServiceContext context) { ExceptionUtilities.CheckArgumentNotNull(dataBeforeSaveChanges, "dataBeforeSaveChanges"); ExceptionUtilities.CheckArgumentNotNull(context, "context"); DataServiceResponseData responseData = new DataServiceResponseData(); responseData.IsBatchResponse = options == SaveChangesOptions.Batch; bool hasChanges = false; // Note: ordering is important as changes should be processed in the order specified by user. foreach (DescriptorData descriptorData in dataBeforeSaveChanges.GetOrderedChanges()) { int statusCode = (int)HttpStatusCode.NoContent; var entityDescriptorData = descriptorData as EntityDescriptorData; if (entityDescriptorData != null) { if (entityDescriptorData.IsMediaLinkEntry && entityDescriptorData.DefaultStreamState == EntityStates.Modified) { responseData.Add(new ChangeOperationResponseData(descriptorData) { StatusCode = statusCode }); } if (descriptorData.State == EntityStates.Added) { statusCode = GetStatusCodeForInsert(context); if (entityDescriptorData.IsMediaLinkEntry) { responseData.Add(new ChangeOperationResponseData(descriptorData) { StatusCode = statusCode }); statusCode = GetStatusCodeForUpdate(context); } } else if (descriptorData.State == EntityStates.Modified) { statusCode = GetStatusCodeForUpdate(context); } else if (descriptorData.State != EntityStates.Deleted) { continue; } } var linkDescriptorData = descriptorData as LinkDescriptorData; if (linkDescriptorData != null && (linkDescriptorData.State == EntityStates.Added || linkDescriptorData.State == EntityStates.Modified)) { if (!linkDescriptorData.WillTriggerSeparateRequest()) { continue; } } responseData.Add(new ChangeOperationResponseData(descriptorData) { StatusCode = statusCode }); hasChanges = true; } if (responseData.IsBatchResponse) { responseData.BatchStatusCode = hasChanges ? (int)HttpStatusCode.Accepted : 0; } else { responseData.BatchStatusCode = -1; } return(responseData); }
/// <summary> /// Calculates the expected response from DataServiceContext.SaveChanges based on the context data before saving changes. /// Assumes there are no errors in the response. /// </summary> /// <param name="dataBeforeSaveChanges">The data before saving changes.</param> /// <param name="options">The options for saving changes.</param> /// <param name="context">The DataServiceContext instance which is calling SaveChanges.</param> /// <returns><see cref="DataServiceResponseData"/> that expresses expectations for the response.</returns> public DataServiceResponseData CalculateSaveChangesResponseData(DataServiceContextData dataBeforeSaveChanges, SaveChangesOptions options, DSClient.DataServiceContext context) { ExceptionUtilities.CheckArgumentNotNull(dataBeforeSaveChanges, "dataBeforeSaveChanges"); ExceptionUtilities.CheckArgumentNotNull(context, "context"); DataServiceResponseData responseData = new DataServiceResponseData(); responseData.IsBatchResponse = options == SaveChangesOptions.Batch; bool hasChanges = false; // Note: ordering is important as changes should be processed in the order specified by user. foreach (DescriptorData descriptorData in dataBeforeSaveChanges.GetOrderedChanges()) { int statusCode = (int)HttpStatusCode.NoContent; var entityDescriptorData = descriptorData as EntityDescriptorData; if (entityDescriptorData != null) { if (entityDescriptorData.IsMediaLinkEntry && entityDescriptorData.DefaultStreamState == EntityStates.Modified) { responseData.Add(new ChangeOperationResponseData(descriptorData) { StatusCode = statusCode }); } if (descriptorData.State == EntityStates.Added) { statusCode = GetStatusCodeForInsert(context); if (entityDescriptorData.IsMediaLinkEntry) { responseData.Add(new ChangeOperationResponseData(descriptorData) { StatusCode = statusCode }); statusCode = GetStatusCodeForUpdate(context); } } else if (descriptorData.State == EntityStates.Modified) { statusCode = GetStatusCodeForUpdate(context); } else if (descriptorData.State != EntityStates.Deleted) { continue; } } var linkDescriptorData = descriptorData as LinkDescriptorData; if (linkDescriptorData != null && (linkDescriptorData.State == EntityStates.Added || linkDescriptorData.State == EntityStates.Modified)) { if (!linkDescriptorData.WillTriggerSeparateRequest()) { continue; } } responseData.Add(new ChangeOperationResponseData(descriptorData) { StatusCode = statusCode }); hasChanges = true; } if (responseData.IsBatchResponse) { responseData.BatchStatusCode = hasChanges ? (int)HttpStatusCode.Accepted : 0; } else { responseData.BatchStatusCode = -1; } return responseData; }