public List <string> GetObjectList(string prefix, ref string marker, int maxEntries, string delimiter, ReceiveContentsDelegate contentsDelegate, ReceivePrefixDelegate prefixDelegate)
        {
            bool          cancelled = false; // True if we have been asked to stop (not presently used).
            bool          truncated = false; // True if there were too many entries to list in one go.
            string        lastKey   = marker;
            List <string> output    = new List <string>();

            do
            {
                string signPath = "/";
                if (IsUS)
                {
                    signPath += bucket;
                }
                string path         = signPath + "?prefix=" + HttpUtility.UrlEncode(pathPrefix + prefix);
                int    prefixLength = (pathPrefix + prefix).Length;

                if (marker.Length > 0)
                {
                    path += "&marker=" + HttpUtility.UrlEncode(marker);
                }
                if (delimiter != null && delimiter.Length > 0)
                {
                    path += "&delimiter=" + HttpUtility.UrlEncode(delimiter);
                }

                S3Request request = new S3Request(this);
                request.Resource = path;
                request.Method   = S3Request.RequestMethod.rmGet;
                S3Response response = request.Perform();

                XmlDocument doc = new XmlDocument();
                doc.Load(response.GetResponseStream());
                response.Close();
                XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
                nsmgr.AddNamespace("s3", doc.LastChild.NamespaceURI); //"http://s3.amazonaws.com/doc/2006-03-01/");

                XmlNode truncatedNode = doc.SelectSingleNode("//s3:IsTruncated", nsmgr);
                truncated = truncatedNode.InnerText.ToUpper().StartsWith("T");

                XmlNodeList contentNodes = doc.SelectNodes("//s3:Contents", nsmgr);
                foreach (XmlNode contentNode in contentNodes)
                {
                    string key = contentNode.SelectSingleNode("./s3:Key", nsmgr).InnerText;
                    if (contentsDelegate != null)
                    {
                        contentsDelegate(key.Remove(0, prefixLength));
                    }
                    lastKey = key;
                }
                XmlNodeList prefixNodes = doc.SelectNodes("//s3:CommonPrefixes/s3:Prefix", nsmgr);
                if (prefixDelegate != null)
                {
                    foreach (XmlNode prefixNode in prefixNodes)
                    {
                        prefixDelegate(prefixNode.InnerText.Remove(0, prefixLength));
                    }
                }
            } while (truncated && (maxEntries == 0 || output.Count < maxEntries) && !cancelled);

            marker = truncated ? lastKey : "";
            return(output);
        }
        public List<string> GetObjectList(string prefix, ref string marker, int maxEntries, string delimiter, ReceiveContentsDelegate contentsDelegate, ReceivePrefixDelegate prefixDelegate)
        {
            bool cancelled = false; // True if we have been asked to stop (not presently used).
            bool truncated = false; // True if there were too many entries to list in one go.
            string lastKey = marker;
            List<string> output = new List<string>();
            do
            {
                string signPath = "/";
                if (IsUS)
                    signPath += bucket;
                string path = signPath + "?prefix=" + HttpUtility.UrlEncode(pathPrefix + prefix);
                int prefixLength = (pathPrefix + prefix).Length;

                if (marker.Length > 0)
                    path += "&marker=" + HttpUtility.UrlEncode(marker);
                if (delimiter != null && delimiter.Length > 0)
                    path += "&delimiter=" + HttpUtility.UrlEncode(delimiter);
                
                S3Request request = new S3Request(this);
                request.Resource = path;
                request.Method = S3Request.RequestMethod.rmGet;
                S3Response response = request.Perform();

                XmlDocument doc = new XmlDocument();
                doc.Load(response.GetResponseStream());
                response.Close();
                XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
                nsmgr.AddNamespace("s3", doc.LastChild.NamespaceURI); //"http://s3.amazonaws.com/doc/2006-03-01/");

                XmlNode truncatedNode = doc.SelectSingleNode("//s3:IsTruncated", nsmgr);
                truncated = truncatedNode.InnerText.ToUpper().StartsWith("T");

                XmlNodeList contentNodes = doc.SelectNodes("//s3:Contents", nsmgr);
                foreach (XmlNode contentNode in contentNodes)
                {
                    string key = contentNode.SelectSingleNode("./s3:Key", nsmgr).InnerText;
                    if(contentsDelegate != null)
                        contentsDelegate(key.Remove(0, prefixLength));
                    lastKey = key;
                }
                XmlNodeList prefixNodes = doc.SelectNodes("//s3:CommonPrefixes/s3:Prefix", nsmgr);
                if(prefixDelegate != null)
                    foreach (XmlNode prefixNode in prefixNodes)
                        prefixDelegate(prefixNode.InnerText.Remove(0, prefixLength));

            } while (truncated && (maxEntries == 0 || output.Count < maxEntries) && !cancelled);

            marker = truncated ? lastKey : "";
            return output;
        }