Example #1
0
        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);
        }
Example #2
0
        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();
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }