コード例 #1
0
        public void ContactDB(string server, string userAgent, string driveName, bool ctdb, bool fuzzy, CTDBMetadataSearch metadataSearch)
        {
            this.driveName = driveName;
            this.userAgent = userAgent + " (" + Environment.OSVersion.VersionString + ")" + (driveName != null ? " (" + driveName + ")" : "");
            this.urlbase   = "http://" + (server ?? defaultServer);
            this.total     = 0;

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlbase
                                                                   + "/lookup2.php"
                                                                   + "?version=3"
                                                                   + "&ctdb=" + (ctdb ? 1 : 0)
                                                                   + "&fuzzy=" + (fuzzy ? 1 : 0)
                                                                   + "&metadata=" + (metadataSearch == CTDBMetadataSearch.None ? "none" : metadataSearch == CTDBMetadataSearch.Fast ? "fast" : metadataSearch == CTDBMetadataSearch.Default ? "default" : "extensive")
                                                                   + "&toc=" + toc.ToString());

            req.Method                 = "GET";
            req.Proxy                  = proxy;
            req.UserAgent              = this.userAgent;
            req.Timeout                = connectTimeout;
            req.ReadWriteTimeout       = socketTimeout;
            req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

            if (uploadHelper.onProgress != null)
            {
                uploadHelper.onProgress(this, new UploadProgressEventArgs(req.RequestUri.AbsoluteUri, 0));
            }

            this.subResult = null;
            this.entries   = new List <DBEntry>();
            this.metadata  = new List <CTDBResponseMeta>();
            currentReq     = req;
            try
            {
                using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
                {
                    this.QueryExceptionStatus  = WebExceptionStatus.ProtocolError;
                    this.QueryResponseStatus   = resp.StatusCode;
                    this.QueryExceptionMessage = resp.StatusDescription;
                    if (this.QueryResponseStatus == HttpStatusCode.OK)
                    {
                        //var serializer = new XmlSerializer(typeof(CTDBResponse));
                        var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.CTDBResponseSerializer();
                        this.total = 0;
                        using (Stream responseStream = resp.GetResponseStream())
                        {
                            CTDBResponse ctdbResp = serializer.Deserialize(responseStream) as CTDBResponse;
                            if (ctdbResp.entry != null)
                            {
                                foreach (var ctdbRespEntry in ctdbResp.entry)
                                {
                                    if (ctdbRespEntry.toc == null)
                                    {
                                        continue;
                                    }
                                    this.total += ctdbRespEntry.confidence;
                                    var entry = new DBEntry(ctdbRespEntry);
                                    entries.Add(entry);
                                }
                            }
                            if (ctdbResp.metadata != null && ctdbResp.metadata.Length != 0)
                            {
                                metadata.AddRange(ctdbResp.metadata);
                            }
                        }
                        if (entries.Count == 0)
                        {
                            this.QueryResponseStatus = HttpStatusCode.NotFound;
                        }
                        else
                        {
                            this.QueryExceptionStatus = WebExceptionStatus.Success;
                        }
                    }
                }
            }
            catch (WebException ex)
            {
                this.QueryExceptionStatus  = ex.Status;
                this.QueryExceptionMessage = ex.Message;
                if (this.QueryExceptionStatus == WebExceptionStatus.ProtocolError)
                {
                    this.QueryResponseStatus   = (ex.Response as HttpWebResponse).StatusCode;
                    this.QueryExceptionMessage = (ex.Response as HttpWebResponse).StatusDescription;
                }
            }
            catch (Exception ex)
            {
                this.QueryExceptionStatus  = WebExceptionStatus.UnknownError;
                this.QueryExceptionMessage = ex.Message;
            }
            finally
            {
                currentReq = null;
            }
        }
コード例 #2
0
        protected CTDBResponse DoSubmit(int confidence, int quality, string artist, string title, string barcode, bool upload, DBEntry confirm, int npar)
        {
            var  files = new List <UploadFile>();
            long maxId = 0;

            foreach (var e in this.entries)
            {
                maxId = Math.Max(maxId, e.id);
            }

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlbase + "/submit2.php");

            req.Proxy            = proxy;
            req.UserAgent        = this.userAgent;
            req.Timeout          = connectTimeout;
            req.ReadWriteTimeout = socketTimeout;
            NameValueCollection form = new NameValueCollection();
            int offset = 0;

            if (confirm != null)
            {
                offset = -confirm.offset;

#if DEBUG
                // Optional sanity check: should be done by server
                if (verify.AR.CTDBCRC(offset) != confirm.crc)
                {
                    throw new Exception("crc mismatch");
                }

                if (confirm.trackcrcs != null)
                {
                    bool crcEquals = true;
                    for (int i = 0; i < confirm.trackcrcs.Length; i++)
                    {
                        crcEquals &= verify.TrackCRC(i + 1, offset) == confirm.trackcrcs[i];
                    }
                    if (!crcEquals)
                    {
                        throw new Exception("track crc mismatch");
                    }
                }

                var  syn2   = verify.AR.GetSyndrome(confirm.Npar, 1, offset);
                bool equals = true;
                for (int i = 0; i < confirm.Npar; i++)
                {
                    equals &= confirm.syndrome[0, i] == syn2[0, i];
                }
                if (!equals)
                {
                    throw new Exception("syndrome mismatch");
                }
#endif
            }
            if (upload)
            {
                files.Add(new UploadFile(new MemoryStream(ParityToSyndrome.Syndrome2Bytes(verify.AR.GetSyndrome(npar, -1, offset))), "parityfile", "data.bin", "application/octet-stream"));
                form.Add("parityfile", "1");
            }
            form.Add("parity", Convert.ToBase64String(ParityToSyndrome.Syndrome2Parity(verify.AR.GetSyndrome(8, 1, offset))));
            form.Add("syndrome", Convert.ToBase64String(ParityToSyndrome.Syndrome2Bytes(verify.AR.GetSyndrome(npar, 1, offset))));
            if (confirm != null)
            {
                form.Add("confirmid", confirm.id.ToString());
            }
            form.Add("ctdb", "2");
            form.Add("npar", npar.ToString());
            form.Add("maxid", maxId.ToString());
            form.Add("toc", toc.ToString());
            form.Add("crc32", ((int)verify.AR.CTDBCRC(offset)).ToString());
            form.Add("trackcrcs", verify.GetTrackCRCs(offset));
            form.Add("confidence", confidence.ToString());
            form.Add("userid", GetUUID());
            form.Add("quality", quality.ToString());
            if (driveName != null && driveName != "")
            {
                form.Add("drivename", driveName);
            }
            if (barcode != null && barcode != "")
            {
                form.Add("barcode", barcode);
            }
            if (artist != null && artist != "")
            {
                form.Add("artist", artist);
            }
            if (title != null && title != "")
            {
                form.Add("title", title);
            }

            currentReq = req;
            try
            {
                using (HttpWebResponse resp = uploadHelper.Upload(req, files.ToArray(), form))
                {
                    if (resp.StatusCode == HttpStatusCode.OK)
                    {
                        using (Stream s = resp.GetResponseStream())
                        {
                            //var serializer = new XmlSerializer(typeof(CTDBResponse));
                            var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.CTDBResponseSerializer();
                            return(serializer.Deserialize(s) as CTDBResponse);
                        }
                    }
                    else
                    {
                        return(new CTDBResponse()
                        {
                            status = "database access error", message = resp.StatusCode.ToString()
                        });
                    }
                }
            }
            catch (WebException ex)
            {
                return(new CTDBResponse()
                {
                    status = "database access error", message = ex.Message ?? ex.Status.ToString()
                });
            }
            catch (Exception ex)
            {
                return(new CTDBResponse()
                {
                    status = "database access error", message = ex.Message
                });
            }
            finally
            {
                currentReq = null;
            }
        }