Пример #1
0
        public DBEntry(CTDBResponseEntry ctdbRespEntry)
        {
            this.syndrome = ctdbRespEntry.syndrome == null
                ? ParityToSyndrome.Parity2Syndrome(1, 1, 8, 8, Convert.FromBase64String(ctdbRespEntry.parity))
                : ParityToSyndrome.Bytes2Syndrome(1, Math.Min(AccurateRipVerify.maxNpar, ctdbRespEntry.npar), Convert.FromBase64String(ctdbRespEntry.syndrome));

            this.conf      = ctdbRespEntry.confidence;
            this.stride    = ctdbRespEntry.stride * 2;
            this.crc       = uint.Parse(ctdbRespEntry.crc32, NumberStyles.HexNumber);
            this.id        = ctdbRespEntry.id;
            this.toc       = CDImageLayout.FromString(ctdbRespEntry.toc);
            this.hasParity = ctdbRespEntry.hasparity;
            if (ctdbRespEntry.trackcrcs != null)
            {
                var crcs = ctdbRespEntry.trackcrcs.Split(' ');
                if (crcs.Length == this.toc.AudioTracks)
                {
                    this.trackcrcs = new uint[crcs.Length];
                    for (int i = 0; i < this.trackcrcs.Length; i++)
                    {
                        this.trackcrcs[i] = uint.Parse(crcs[i], NumberStyles.HexNumber);
                    }
                }
            }
        }
Пример #2
0
        public unsafe void CDRepairEncodeSynParTest()
        {
            var syndrome   = encode.AR.GetSyndrome();
            var parityCopy = ParityToSyndrome.Syndrome2Parity(syndrome);

            CollectionAssert.AreEqual(syndrome, ParityToSyndrome.Parity2Syndrome(syndrome.GetLength(0), syndrome.GetLength(0), syndrome.GetLength(1), syndrome.GetLength(1), parityCopy));
        }
Пример #3
0
        private static byte[] Unparse(ushort[,] syndrome, int version)
        {
            if (version == 1)
            {
                return(ParityToSyndrome.Syndrome2Bytes(syndrome));
            }

            var output      = ParityToSyndrome.Syndrome2Parity(syndrome);
            var newcontents = new MemoryStream();

            using (DBHDR FTYP = new DBHDR(newcontents, "ftyp"))
                FTYP.Write("CTDB");
            using (DBHDR CTDB = new DBHDR(newcontents, "CTDB"))
            {
                using (DBHDR HEAD = CTDB.HDR("HEAD"))
                {
                    using (DBHDR VERS = HEAD.HDR("VERS")) VERS.Write(0x101);
                }
                using (DBHDR DISC = CTDB.HDR("DISC"))
                {
                    using (DBHDR CONF = DISC.HDR("CONF")) CONF.Write(1);
                    using (DBHDR NPAR = DISC.HDR("NPAR")) NPAR.Write(8);
                    using (DBHDR CRC_ = DISC.HDR("CRC ")) CRC_.Write(0);
                    using (DBHDR PAR_ = DISC.HDR("PAR ")) PAR_.Write(output);
                }
            }
            return(newcontents.ToArray());
        }
Пример #4
0
        public void CDRepairEncodeSpeedTest()
        {
            var generator = new TestImageGenerator("0 75000", seed, 0, 0);
            var encode    = generator.CreateCDRepairEncode(stride);

            Assert.AreEqual <string>(Convert.ToBase64String(Convert.FromBase64String(encodeSyndrome1), 0, AccurateRipVerify.maxNpar * 2 * 4),
                                     Convert.ToBase64String(ParityToSyndrome.Syndrome2Bytes(encode.AR.GetSyndrome(AccurateRipVerify.maxNpar, 4))), "syndrome mismatch");
        }
Пример #5
0
 public void CDRepairEncodeParityTest()
 {
     for (int n = 8; n <= AccurateRipVerify.maxNpar; n *= 2)
     {
         Assert.AreEqual <string>(encodeParity[n], Convert.ToBase64String(ParityToSyndrome.Syndrome2Parity(encode.AR.GetSyndrome(n)), 0, 64));
     }
     Assert.AreEqual <uint>(377539636, encode.CRC);
 }
Пример #6
0
        public unsafe void CDRepairSyndrome2ParitySpeedTest()
        {
            var syndrome = encode.AR.GetSyndrome();

            byte[] parityCopy = ParityToSyndrome.Syndrome2Parity(syndrome);
            for (int t = 0; t < 100; t++)
            {
                ParityToSyndrome.Syndrome2Parity(syndrome, parityCopy);
            }
            CollectionAssert.AreEqual(syndrome, ParityToSyndrome.Parity2Syndrome(syndrome.GetLength(0), syndrome.GetLength(0), syndrome.GetLength(1), syndrome.GetLength(1), parityCopy));
        }
Пример #7
0
 static void Main(string[] args)
 {
     if (args.Length == 2 && (0 == string.Compare(args[0], "upconvert", true) || 0 == string.Compare(args[0], "downconvert", true)))
     {
         int id       = int.Parse(args[1]);
         var version  = 0 == string.Compare(args[0], "upconvert", true) ? 1 : 2;
         var contents = Fetch("http://p.cuetools.net/" + id.ToString());
         var syndrome = Parse(contents, version);
         var stdout   = System.Console.OpenStandardOutput();
         var output   = Unparse(syndrome, version);
         stdout.Write(output, 0, output.Length);
     }
     else if (args.Length == 2 && 0 == string.Compare(args[0], "p2s", true))
     {
         var p      = ParityToSyndrome.Parity2Syndrome(1, 1, 8, 8, Convert.FromBase64String(args[1]));
         var output = ParityToSyndrome.Syndrome2Bytes(p);
         System.Console.Write(Convert.ToBase64String(output));
     }
     else
     {
         throw new Exception("Usage: upconvert <id> | downconvert <id> | p2s <parity>");
     }
 }
Пример #8
0
        public unsafe void CDRepairSyndrome2BytesTest()
        {
            var syndrome = encode.AR.GetSyndrome();

            CollectionAssert.AreEqual(syndrome, ParityToSyndrome.Bytes2Syndrome(stride, AccurateRipVerify.maxNpar, ParityToSyndrome.Syndrome2Bytes(syndrome)));
        }
Пример #9
0
 public void CDRepairEncodeSyndromeTest()
 {
     for (int n = 4; n <= AccurateRipVerify.maxNpar; n *= 2)
     {
         Assert.AreEqual <string>(Convert.ToBase64String(Convert.FromBase64String(encodeSyndrome), 0, n * 2 * 4), Convert.ToBase64String(ParityToSyndrome.Syndrome2Bytes(encode.AR.GetSyndrome(n, 4))), "syndrome mismatch");
         Assert.AreEqual <string>(Convert.ToBase64String(Convert.FromBase64String(encodeSyndromePosOffset), 0, n * 2 * 4), Convert.ToBase64String(ParityToSyndrome.Syndrome2Bytes(encode.AR.GetSyndrome(n, 4, offset))), "syndrome with offset mismatch");
         Assert.AreEqual <string>(Convert.ToBase64String(Convert.FromBase64String(encodeSyndromeNegOffset), 0, n * 2 * 4), Convert.ToBase64String(ParityToSyndrome.Syndrome2Bytes(encode.AR.GetSyndrome(n, 4, -offset))), "syndrome with neg offset mismatch");
     }
     Assert.AreEqual <uint>(377539636, encode.CRC);
 }
Пример #10
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));
                            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;
            }
        }
Пример #11
0
        public ushort[,] FetchDB(DBEntry entry, int npar, ushort[,] syn)
        {
            string         url     = entry.hasParity[0] == '/' ? urlbase + entry.hasParity : entry.hasParity;
            HttpWebRequest req     = (HttpWebRequest)WebRequest.Create(url);
            int            prevLen = syn == null ? 0 : syn.GetLength(1) * entry.stride * 2;

            req.Method                 = "GET";
            req.Proxy                  = proxy;
            req.UserAgent              = this.userAgent;
            req.Timeout                = connectTimeout;
            req.ReadWriteTimeout       = socketTimeout;
            req.AutomaticDecompression = DecompressionMethods.None;
            req.AddRange(prevLen, npar * entry.stride * 2 - 1);

            currentReq = req;
            try
            {
                using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
                {
                    if (resp.StatusCode != HttpStatusCode.OK && resp.StatusCode != HttpStatusCode.PartialContent)
                    {
                        entry.httpStatus = resp.StatusCode;
                        return(null);
                    }
                    if (resp.StatusCode == HttpStatusCode.OK && resp.ContentLength == entry.Npar * entry.stride * 2)
                    {
                        npar    = entry.Npar;
                        prevLen = 0;
                        syn     = null;
                    }
                    else if (resp.StatusCode != HttpStatusCode.PartialContent || (resp.ContentLength + prevLen) != npar * entry.stride * 2)
                    {
                        entry.httpStatus = HttpStatusCode.PartialContent;
                        return(null);
                    }

                    using (Stream responseStream = resp.GetResponseStream())
                    {
                        byte[] contents = syn == null ? null : ParityToSyndrome.Syndrome2Bytes(syn);
                        Array.Resize(ref contents, prevLen + (int)resp.ContentLength);
                        int pos = prevLen, count = 0;
                        do
                        {
                            if (uploadHelper.onProgress != null)
                            {
                                uploadHelper.onProgress(url, new UploadProgressEventArgs(req.RequestUri.AbsoluteUri, ((double)pos) / (entry.Npar * entry.stride * 2)));
                            }
                            count = responseStream.Read(contents, pos, Math.Min(contents.Length - pos, 32768));
                            pos  += count;
                        } while (count != 0);

                        if (pos != contents.Length)
                        {
                            entry.httpStatus = HttpStatusCode.PartialContent;
                            return(null);
                        }

                        syn = ParityToSyndrome.Bytes2Syndrome(entry.stride, npar, contents);
                        for (int i = 0; i < npar; i++)
                        {
                            if (syn[0, i] != entry.syndrome[0, i])
                            {
                                entry.httpStatus = HttpStatusCode.Conflict;
                                return(null);
                            }
                        }
                        entry.httpStatus = HttpStatusCode.OK;
                        return(syn);
                    }
                }
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError)
                {
                    entry.httpStatus = ((HttpWebResponse)ex.Response).StatusCode;
                }
                else
                {
                    entry.httpStatus = HttpStatusCode.BadRequest;
                }
            }
            finally
            {
                currentReq = null;
            }
            return(null);
        }
Пример #12
0
        private static ushort[,] Parse(byte[] contents, int version)
        {
            if (version == 2)
            {
                int npar = contents.Length / stride / 2;
                if (npar < 8 || npar > 32 || contents.Length != npar * stride * 2)
                {
                    throw new Exception("invalid parity length");
                }
                return(ParityToSyndrome.Bytes2Syndrome(stride, 8, contents));
            }

            if (contents.Length < 8 * stride * 2 ||
                contents.Length > 8 * stride * 4)
            {
                throw new Exception("invalid length");
            }

            ReadDB rdr = new ReadDB(contents);

            int    end;
            string hdr   = rdr.ReadHDR(out end);
            uint   magic = rdr.ReadUInt();

            if (hdr != "ftyp" || magic != 0x43544442 || end != rdr.pos)
            {
                throw new Exception("invalid CTDB file");
            }
            hdr = rdr.ReadHDR(out end);
            if (hdr != "CTDB" || end != contents.Length)
            {
                throw new Exception("invalid CTDB file");
            }
            hdr = rdr.ReadHDR(out end);
            if (hdr != "HEAD")
            {
                throw new Exception("invalid CTDB file");
            }
            int endHead = end;

            while (rdr.pos < endHead)
            {
                hdr     = rdr.ReadHDR(out end);
                rdr.pos = end;
            }
            rdr.pos = endHead;
            while (rdr.pos < contents.Length)
            {
                hdr = rdr.ReadHDR(out end);
                if (hdr != "DISC")
                {
                    rdr.pos = end;
                    continue;
                }
                int endDisc = end;
                int parPos = 0, parLen = 0;
                while (rdr.pos < endDisc)
                {
                    hdr = rdr.ReadHDR(out end);
                    if (hdr == "PAR ")
                    {
                        parPos = rdr.pos;
                        parLen = end - rdr.pos;
                    }
                    rdr.pos = end;
                }
                if (parPos != 0)
                {
                    if (parLen != 8 * stride * 2)
                    {
                        throw new Exception("invalid parity length");
                    }
                    return(ParityToSyndrome.Parity2Syndrome(stride, stride, 8, 8, contents, parPos));
                }
            }
            throw new Exception("invalid CTDB file");
        }