private async Task <PNResult <PNFileUploadResult> > ProcessFileUpload(Dictionary <string, object> externalQueryParam) { PNResult <PNFileUploadResult> ret = new PNResult <PNFileUploadResult>(); if (string.IsNullOrEmpty(this.sendFileName)) { PNStatus errStatus = new PNStatus { Error = true, ErrorData = new PNErrorData("Missing File", new ArgumentException("Missing File")) }; ret.Status = errStatus; return(ret); } PNResult <PNGenerateFileUploadUrlResult> generateFileUploadUrl = await GenerateFileUploadUrl(externalQueryParam).ConfigureAwait(false); PNGenerateFileUploadUrlResult generateFileUploadUrlResult = generateFileUploadUrl.Result; PNStatus generateFileUploadUrlStatus = generateFileUploadUrl.Status; if (generateFileUploadUrlStatus.Error || generateFileUploadUrlResult == null) { PNStatus errStatus = new PNStatus { Error = true, ErrorData = new PNErrorData("Error in GenerateFileUploadUrl. Try again.", new ArgumentException("Error in GenerateFileUploadUrl. Try again.")) }; ret.Status = errStatus; return(ret); } LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity); RequestState <PNFileUploadResult> requestState = new RequestState <PNFileUploadResult>(); requestState.ResponseType = PNOperationType.PNFileUploadOperation; requestState.Reconnect = false; requestState.EndPointOperation = this; requestState.UsePostMethod = true; byte[] sendFileByteArray = GetByteArrayFromFilePath(sendFileFullPath); string dataBoundary = String.Format("----------{0:N}", Guid.NewGuid()); string contentType = "multipart/form-data; boundary=" + dataBoundary; string currentCipherKey = !string.IsNullOrEmpty(this.currentFileCipherKey) ? this.currentFileCipherKey : config.CipherKey; byte[] postData = GetMultipartFormData(sendFileByteArray, generateFileUploadUrlResult.FileName, generateFileUploadUrlResult.FileUploadRequest.FormFields, dataBoundary, currentCipherKey, config, pubnubLog); Tuple <string, PNStatus> JsonAndStatusTuple = await UrlProcessRequest(new Uri(generateFileUploadUrlResult.FileUploadRequest.Url), requestState, false, postData, contentType).ConfigureAwait(false); ret.Status = JsonAndStatusTuple.Item2; string json = JsonAndStatusTuple.Item1; if (!string.IsNullOrEmpty(json)) { LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl -> file upload OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity); //do internal publish after successful file upload Dictionary <string, object> publishPayload = new Dictionary <string, object>(); if (this.publishMessage != null && !string.IsNullOrEmpty(this.publishMessage.ToString())) { publishPayload.Add("message", this.publishMessage); } currentFileId = generateFileUploadUrlResult.FileId; publishPayload.Add("file", new Dictionary <string, string> { { "id", generateFileUploadUrlResult.FileId }, { "name", generateFileUploadUrlResult.FileName } }); int publishFileRetryLimit = config.FileMessagePublishRetryLimit; int currentFileRetryCount = 0; bool publishFailed = false; do { currentFileRetryCount += 1; PNResult <PNPublishFileMessageResult> publishFileMessageResponse = await PublishFileMessage(publishPayload, queryParam).ConfigureAwait(false); PNPublishFileMessageResult publishFileMessage = publishFileMessageResponse.Result; PNStatus publishFileMessageStatus = publishFileMessageResponse.Status; if (!publishFileMessageStatus.Error && publishFileMessage != null) { publishFailed = false; PNFileUploadResult result = new PNFileUploadResult(); result.Timetoken = publishFileMessage.Timetoken; result.FileId = generateFileUploadUrlResult.FileId; result.FileName = generateFileUploadUrlResult.FileName; ret.Result = result; ret.Status.Error = false; LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl -> file upload -> PublishFileMessage -> OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity); //do internal publish after successful file upload } else { publishFailed = true; ret.Status = publishFileMessageStatus; LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} PublishFileMessage Failed. currentFileRetryCount={1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), currentFileRetryCount), config.LogVerbosity); #if !NET35 && !NET40 Task.Delay(1000).Wait(); #else Thread.Sleep(1000); #endif } }while (publishFailed && currentFileRetryCount <= publishFileRetryLimit); } return(ret); }
private void ProcessFileUpload(Dictionary <string, object> externalQueryParam, PNCallback <PNFileUploadResult> callback) { PNResult <PNGenerateFileUploadUrlResult> generateFileUploadUrl = GenerateFileUploadUrl(externalQueryParam).Result; PNGenerateFileUploadUrlResult generateFileUploadUrlResult = generateFileUploadUrl.Result; PNStatus generateFileUploadUrlStatus = generateFileUploadUrl.Status; if (generateFileUploadUrlStatus.Error || generateFileUploadUrlResult == null) { PNStatus errStatus = new PNStatus { Error = true, ErrorData = new PNErrorData("Error in GenerateFileUploadUrl. Try again.", new ArgumentException("Error in GenerateFileUploadUrl. Try again.")) }; if (callback != null) { callback.OnResponse(null, errStatus); } return; } LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity); RequestState <PNFileUploadResult> requestState = new RequestState <PNFileUploadResult>(); requestState.ResponseType = PNOperationType.PNFileUploadOperation; requestState.PubnubCallback = callback; requestState.Reconnect = false; requestState.EndPointOperation = this; requestState.UsePostMethod = true; byte[] sendFileByteArray = GetByteArrayFromFilePath(sendFileFullPath); string dataBoundary = String.Format("----------{0:N}", Guid.NewGuid()); string contentType = "multipart/form-data; boundary=" + dataBoundary; string currentCipherKey = !string.IsNullOrEmpty(this.currentFileCipherKey) ? this.currentFileCipherKey : config.CipherKey; byte[] postData = GetMultipartFormData(sendFileByteArray, generateFileUploadUrlResult.FileName, generateFileUploadUrlResult.FileUploadRequest.FormFields, dataBoundary, currentCipherKey, config, pubnubLog); string json; UrlProcessRequest(new Uri(generateFileUploadUrlResult.FileUploadRequest.Url), requestState, false, postData, contentType).ContinueWith(r => { json = r.Result.Item1; if (!string.IsNullOrEmpty(json) && string.Compare(json, "{}", StringComparison.CurrentCultureIgnoreCase) == 0) { LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl -> file upload OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity); //do internal publish after successful file upload Dictionary <string, object> publishPayload = new Dictionary <string, object>(); if (this.publishMessage != null && !string.IsNullOrEmpty(this.publishMessage.ToString())) { publishPayload.Add("message", this.publishMessage); } publishPayload.Add("file", new Dictionary <string, string> { { "id", generateFileUploadUrlResult.FileId }, { "name", generateFileUploadUrlResult.FileName } }); int publishFileRetryLimit = config.FileMessagePublishRetryLimit; int currentFileRetryCount = 0; bool publishFailed = false; do { currentFileRetryCount += 1; PNResult <PNPublishFileMessageResult> publishFileMessageResponse = PublishFileMessage(publishPayload, queryParam).Result; PNPublishFileMessageResult publishFileMessage = publishFileMessageResponse.Result; PNStatus publishFileMessageStatus = publishFileMessageResponse.Status; if (!publishFileMessageStatus.Error && publishFileMessage != null) { publishFailed = false; PNFileUploadResult result = new PNFileUploadResult(); result.Timetoken = publishFileMessage.Timetoken; result.FileId = generateFileUploadUrlResult.FileId; result.FileName = generateFileUploadUrlResult.FileName; LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl -> file upload -> PublishFileMessage -> OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity); r.Result.Item2.Error = false; callback.OnResponse(result, r.Result.Item2); } else { publishFailed = true; if (currentFileRetryCount == publishFileRetryLimit) { callback.OnResponse(null, publishFileMessageStatus); } LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} PublishFileMessage Failed. currentFileRetryCount={1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), currentFileRetryCount), config.LogVerbosity); #if !NET35 && !NET40 Task.Delay(1000).Wait(); #else Thread.Sleep(1000); #endif } }while (publishFailed && currentFileRetryCount <= publishFileRetryLimit); } else { if (r.Result.Item2 != null) { callback.OnResponse(null, r.Result.Item2); } } }, TaskContinuationOptions.ExecuteSynchronously).Wait(); }