public InternationalResponse ValidateRequest(InternationalRequest request)
        {
            InternationalResponse result = new InternationalResponse();

            if (request == null)
            {
                result.Errors.Add(new USPSError()
                {
                    Description = "Request was null"
                });
                return(result);
            }

            if (request.Packages.Count < 1)
            {
                result.Errors.Add(new USPSError()
                {
                    Description = "Request requires at least one package."
                });
            }

            if (request.UserId.Trim().Length < 1)
            {
                result.Errors.Add(new USPSError()
                {
                    Description = "UserId is Required for Requests"
                });
            }

            return(result);
        }
        public InternationalResponse ProcessRequest(InternationalRequest request)
        {
            this.LastResponse = string.Empty;
            this.LastRequest  = string.Empty;

            // Validate Request First
            InternationalResponse result = ValidateRequest(request);

            if (result.Errors.Count > 0)
            {
                return(result);
            }

            try
            {
                string sURL = request.ApiUrl;
                sURL += "?API=IntlRateV2&XML=";

                // Build XML
                string requestXml = string.Empty;

                StringWriter  sw = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
                XmlTextWriter xw = new XmlTextWriter(sw);

                xw.Formatting = Formatting.None;

                // Start Request
                xw.WriteStartElement("IntlRateV2Request");
                xw.WriteAttributeString("USERID", request.UserId);
                xw.WriteElementString("Revision", request.Revision);

                foreach (InternationalPackage pak in request.Packages)
                {
                    pak.WriteToXml(ref xw);
                }

                //End Rate Request
                xw.WriteEndElement();
                xw.Flush();
                xw.Close();
                requestXml = sw.GetStringBuilder().ToString();
                if (!requestXml.StartsWith("<"))
                {
                    requestXml = requestXml.Substring(1, requestXml.Length - 1);
                }

                // Diagnostics
                this.LastRequest = requestXml;

                string sResponse  = string.Empty;
                string dataToSend = sURL + System.Web.HttpUtility.UrlEncode(requestXml);

                sResponse = readHtmlPage(dataToSend);

                // Diagnostics
                this.LastResponse = sResponse;

                result = new InternationalResponse(sResponse);
            }
            catch (Exception ex)
            {
                result.Errors.Add(new USPSError()
                {
                    Description = ex.Message + " " + ex.StackTrace, Source = "BV Exception"
                });
            }
            return(result);
        }
        public InternationalResponse ValidateRequest(InternationalRequest request)
        {
            InternationalResponse result = new InternationalResponse();

            if (request == null)
            {
                result.Errors.Add(new USPSError() { Description = "Request was null" });
                return result;
            }

            if (request.Packages.Count < 1)
            {
                result.Errors.Add(new USPSError() { Description = "Request requires at least one package." });            
            }

            if (request.UserId.Trim().Length < 1)
            {
                result.Errors.Add(new USPSError() { Description = "UserId is Required for Requests" });
            }            

            return result;
        }
        public InternationalResponse ProcessRequest(InternationalRequest request)
        {
            this.LastResponse = string.Empty;
            this.LastRequest = string.Empty;

            // Validate Request First
            InternationalResponse result = ValidateRequest(request);
            if (result.Errors.Count > 0) return result;

            try
            {

                string sURL = request.ApiUrl;
                sURL += "?API=IntlRateV2&XML=";

                // Build XML
                string requestXml = string.Empty;

                StringWriter sw = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
                XmlTextWriter xw = new XmlTextWriter(sw);

                xw.Formatting = Formatting.None;

                // Start Request
                xw.WriteStartElement("IntlRateV2Request");
                xw.WriteAttributeString("USERID", request.UserId);
                xw.WriteElementString("Revision", request.Revision);

                foreach (InternationalPackage pak in request.Packages)
                {
                    pak.WriteToXml(ref xw);
                }

                //End Rate Request
                xw.WriteEndElement();
                xw.Flush();
                xw.Close();
                requestXml = sw.GetStringBuilder().ToString();
                if (!requestXml.StartsWith("<"))
                {
                    requestXml = requestXml.Substring(1, requestXml.Length - 1);
                }

                // Diagnostics
                this.LastRequest = requestXml;
                
                string sResponse = string.Empty;
                string dataToSend = sURL + System.Web.HttpUtility.UrlEncode(requestXml);

                sResponse = readHtmlPage(dataToSend);

                // Diagnostics
                this.LastResponse = sResponse;                

                result = new InternationalResponse(sResponse);
            }
            catch (Exception ex)
            {
                result.Errors.Add(new USPSError() { Description = ex.Message + " " + ex.StackTrace, Source = "BV Exception" });
            }
            return result;
        }
        private List<IShippingRate> RatePackages(List<InternationalPackage> packages)
        {

            List<IShippingRate> rates = new List<IShippingRate>();

            InternationalRequest req = new InternationalRequest();
            req.Packages = packages;

            InternationalService svc = new InternationalService();
            InternationalResponse res = svc.ProcessRequest(req);
                        
            
            if (this.GlobalSettings.DiagnosticsMode)
            {
                _Logger.LogMessage("US Postal Intl. Request: " + svc.LastRequest);
                _Logger.LogMessage("US Postal Intl. Response: " + svc.LastResponse);                                
            }

            bool hasErrors = (res.Errors.Count > 0);
                
            
                        
            foreach (InternationalServiceType possibleResponse in Enum.GetValues(typeof(InternationalServiceType)))            
            {
                bool AllPackagesRated = true;
                decimal totalRate = 0m;
                string serviceDesciption = string.Empty;

                foreach (InternationalPackage p in res.Packages)
                {
                    InternationalPostage found = p.Postages.Where(y => y.ServiceId == ((int)possibleResponse).ToString()).FirstOrDefault();
                    if (found == null)
                    {                        
                        AllPackagesRated = false;
                        break;
                    }

                    totalRate += found.Rate;
                    serviceDesciption = System.Web.HttpUtility.HtmlDecode(found.ServiceDescription);
                }

                if (AllPackagesRated && totalRate > 0)
                {
                    // Rate is good to go for all packages
                    rates.Add(new ShippingRate() { EstimatedCost = totalRate, ServiceId = this.Id, ServiceCodes = ((int)possibleResponse).ToString(), 
                                                    DisplayName = "USPS:" + serviceDesciption});
                }            
            }
            
            
            return rates;
        }