private async Task <PNResult <PNPublishFileMessageResult> > PublishFileMessage(object message, Dictionary <string, object> externalQueryParam) { PNResult <PNPublishFileMessageResult> ret = new PNResult <PNPublishFileMessageResult>(); IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null) ? PubnubInstance.InstanceId : ""); Uri request = urlBuilder.BuildPublishFileMessageRequest("GET", "", this.channelName, message, this.storeInHistory, this.ttl, this.userMetadata, null, externalQueryParam); RequestState <PNPublishFileMessageResult> requestState = new RequestState <PNPublishFileMessageResult>(); requestState.Channels = new[] { this.channelName }; requestState.ResponseType = PNOperationType.PNPublishFileMessageOperation; requestState.PubnubCallback = null; requestState.Reconnect = false; requestState.EndPointOperation = this; string json = ""; await UrlProcessRequest(request, requestState, false).ContinueWith(r => { json = r.Result.Item1; if (!string.IsNullOrEmpty(json)) { List <object> result = ProcessJsonResponse(requestState, json); ResponseBuilder responseBuilder = new ResponseBuilder(config, jsonLibrary, pubnubLog); PNPublishFileMessageResult publishResult = responseBuilder.JsonToObject <PNPublishFileMessageResult>(result, true); StatusBuilder statusBuilder = new StatusBuilder(config, jsonLibrary); if (publishResult != null) { ret.Result = publishResult; PNStatus status = statusBuilder.CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNAcknowledgmentCategory, requestState, (int)HttpStatusCode.OK, null); ret.Status = status; } else { PNException ex = new PNException("File has been upload but the notification couldn't be sent to the subscribed users"); PNStatus status = statusBuilder.CreateStatusResponse(requestState.ResponseType, PNStatusCategory.PNUnknownCategory, requestState, (int)HttpStatusCode.BadRequest, ex); status.AdditonalData = new Dictionary <string, string> { { "FileId", currentFileId }, { "FileName", sendFileName } }; ret.Status = status; } } }, TaskContinuationOptions.ExecuteSynchronously); 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(); }
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 async Task <PNResult <PNPublishFileMessageResult> > ProcessFileMessagePublish(Dictionary <string, object> externalQueryParam) { PNResult <PNPublishFileMessageResult> ret = new PNResult <PNPublishFileMessageResult>(); if (string.IsNullOrEmpty(this.currentFileId) || string.IsNullOrEmpty(this.currentFileName)) { PNStatus errStatus = new PNStatus { Error = true, ErrorData = new PNErrorData("Missing File Id or Name", new ArgumentException("Missing File Id or Name")) }; ret.Status = errStatus; return(ret); } if (string.IsNullOrEmpty(this.channelName) || string.IsNullOrEmpty(this.channelName.Trim())) { PNStatus errStatus = new PNStatus { Error = true, ErrorData = new PNErrorData("Missing Channel", new ArgumentException("Missing Channel")) }; ret.Status = errStatus; return(ret); } Dictionary <string, object> publishPayload = new Dictionary <string, object>(); if (this.msg != null && !string.IsNullOrEmpty(this.msg.ToString())) { publishPayload.Add("message", this.msg); } publishPayload.Add("file", new Dictionary <string, string> { { "id", currentFileId }, { "name", currentFileName } }); RequestState <PNPublishFileMessageResult> requestState = new RequestState <PNPublishFileMessageResult>(); requestState.ResponseType = PNOperationType.PNPublishFileMessageOperation; requestState.Reconnect = false; requestState.EndPointOperation = this; IUrlRequestBuilder urlBuilder = new UrlRequestBuilder(config, jsonLibrary, unit, pubnubLog, pubnubTelemetryMgr, (PubnubInstance != null) ? PubnubInstance.InstanceId : ""); Uri request = urlBuilder.BuildPublishFileMessageRequest("GET", "", this.channelName, publishPayload, this.storeInHistory, this.ttl, this.userMetadata, null, externalQueryParam); Tuple <string, PNStatus> JsonAndStatusTuple = await UrlProcessRequest(request, requestState, false).ConfigureAwait(false); ret.Status = JsonAndStatusTuple.Item2; string json = JsonAndStatusTuple.Item1; if (!string.IsNullOrEmpty(json)) { List <object> result = ProcessJsonResponse(requestState, json); if (result != null && result.Count >= 3) { int publishStatus; Int32.TryParse(result[0].ToString(), out publishStatus); if (publishStatus == 1) { List <object> resultList = ProcessJsonResponse(requestState, json); if (resultList != null && resultList.Count > 0) { ResponseBuilder responseBuilder = new ResponseBuilder(config, jsonLibrary, pubnubLog); PNPublishFileMessageResult responseResult = responseBuilder.JsonToObject <PNPublishFileMessageResult>(resultList, true); if (responseResult != null) { ret.Result = responseResult; } } } } } return(ret); }