示例#1
0
        private bool m_LoadMetEdonkeyOld(string metfile)
        {
            m_UnknownParameters=new ArrayList();

            FileStream knownmet;
            BinaryReader reader;

            try
            {
                knownmet=File.OpenRead(metfile);
            }
            catch
            {
                if (metfile==m_CompleteNameMet)
                {
                    CLog.Log (Constants.Log.Notify, "Load MET File Error. " + m_MetFile + ". File not found. Trying to recover from backup file.");
                    return m_LoadMet(m_CompleteNameMet + ".backup");
                }
                else
                {
                    return false;
                }
            }
            reader=new BinaryReader(knownmet);

            try
            {
                if (((byte)reader.ReadByte()!=(byte)0xE0)||(reader.ReadByte()!=(byte)02))
                {
                    reader.Close();
                    knownmet.Close();
                    if (metfile==m_CompleteNameMet)
                    {
                        CLog.Log (Constants.Log.Notify, "Load MET File Error. " + m_MetFile + ". Header not match. Trying to recover from backup file.");
                        return m_LoadMet(m_CompleteNameMet + ".backup");
                    }
                    else
                    {
                        return false;
                    }
                }

                // test for new edonkey format
                byte[] test = new byte[4];
                reader.BaseStream.Seek(24, SeekOrigin.Begin);
                test = reader.ReadBytes(4);

                reader.BaseStream.Seek(2, SeekOrigin.Begin);

                if ((test[0] == 0) &&
                    (test[1] == 0) &&
                    (test[2] == 2) &&
                    (test[3] == 1))
                {
                    // new edonkey format
                    m_FileDate=new DateTime(((long)reader.ReadUInt32()*10000000L)+621355968000000000L);
                    FileHash=reader.ReadBytes(16);

                    m_LoadMetParameters(reader);

                    if (reader.BaseStream.Position < reader.BaseStream.Length)
                    {
                        byte temp = reader.ReadByte();

                        m_NumChunks=(ushort)CHash.GetChunksCount(m_FileSize);
                        m_HashSet = new ArrayList(m_NumChunks);

                        for (uint i = 0; i < m_NumChunks && (reader.BaseStream.Position + 16 < reader.BaseStream.Length); i++)
                        {
                            byte[] cur_hash = new byte[16];
                            cur_hash = reader.ReadBytes(16);
                            m_HashSet.Add(cur_hash);
                        }
                        //Console.WriteLine(reader.BaseStream.Position.ToString());
                        //Console.WriteLine(reader.BaseStream.Length.ToString());

                        byte[] hash = CHash.DoHashSetHash(m_HashSet);
                        //Console.WriteLine(CKernel.HashToString(hash));
                    }
                }
                else
                {
                    // old edonkey format
                    m_FileDate=new DateTime(((long)reader.ReadUInt32()*10000000L)+621355968000000000L);

                    FileHash=reader.ReadBytes(16);
                    m_FileFormat=Protocol.PartMet.eDonkeyOld;
                    m_LoadMetParameters(reader);

                    m_NumChunks=(ushort)CHash.GetChunksCount(m_FileSize);
                    m_HashSet=new ArrayList(m_NumChunks);
                    m_CrumbsHashSet=new ArrayList((ushort)CHash.GetCrumbsCount(m_FileSize));

                    if (reader.PeekChar()>=0)
                    {
                        if ((m_NumChunks>1)&&(reader.ReadByte()==(byte)1))
                        {
                            for (uint parte=0;parte!=m_NumChunks;parte++)
                            {
                                m_HashSet.Add(reader.ReadBytes(16));
                            }
                        }
                        if ((reader.PeekChar()>=0)&&
                            (reader.ReadByte()==(byte)1))
                        {
                            for (uint crumb=0;crumb!=CHash.GetCrumbsCount(m_FileSize);crumb++)
                            {
                                m_CrumbsHashSet.Add(reader.ReadBytes(8));
                            }
                        }
                    }
                }
            }
            catch
            {
                reader.Close();
                knownmet.Close();
                if (metfile==m_CompleteNameMet)
                {
                    CLog.Log (Constants.Log.Notify, "Load MET File Error. " + m_MetFile + ". Error in data. Trying to recover from backup file.");
                    return m_LoadMetEdonkeyOld(m_CompleteNameMet + ".backup");
                }
                else
                {
                    return false;
                }
            }
            reader.Close();
            knownmet.Close();
            return true;
        }
示例#2
0
        private bool m_LoadMet(string metfile)
        {
            m_UnknownParameters=new ArrayList();

            FileStream knownmet;
            BinaryReader reader;

            try
            {
                knownmet=File.OpenRead(metfile);
            }
            catch
            {
                if (metfile==m_CompleteNameMet)
                {
                    CLog.Log (Constants.Log.Notify, "Load MET File Error. " + m_MetFile + ". File not found. Trying to recover from backup file.");
                    return m_LoadMet(m_CompleteNameMet + ".backup");
                }
                else
                {
                    return false;
                }
            }
            reader=new BinaryReader(knownmet);

            try
            {
                if ((byte)reader.ReadByte()!=(byte)0xE0)
                {
                    reader.Close();
                    knownmet.Close();
                    if (metfile==m_CompleteNameMet)
                    {
                        CLog.Log (Constants.Log.Notify, "Load MET File Error. " + m_MetFile + ". Header not match. Trying to recover from backup file.");
                        return m_LoadMet(m_CompleteNameMet + ".backup");
                    }
                    else
                    {
                        return false;
                    }
                }

                m_FileDate=new DateTime(((long)reader.ReadUInt32()*10000000L)+621355968000000000L);

                FileHash=reader.ReadBytes(16);

                m_NumChunks=reader.ReadUInt16();

                m_HashSet=new ArrayList(m_NumChunks);

                for (uint parte=0;parte!=m_NumChunks;parte++)
                {
                    m_HashSet.Add(reader.ReadBytes(16));
                }

                //Gaps=new SortedList();
                m_LoadMetParameters(reader);
            }
            catch
            {
                reader.Close();
                knownmet.Close();
                if (metfile==m_CompleteNameMet)
                {
                    // try lo load with the .met edonkey format
                    if (this.m_LoadMetEdonkeyOld(m_CompleteNameMet))
                    {
                        return true;
                    }
                    else
                    {
                        // try to recover a backup
                        CLog.Log (Constants.Log.Notify, "Load MET File Error. " + m_MetFile + ". Error in data. Trying to recover from backup file.");
                        return m_LoadMet(m_CompleteNameMet + ".backup");
                    }
                }
                else
                {
                    return false;
                }
            }
            m_FileFormat=Protocol.PartMet.eMule;
            reader.Close();
            knownmet.Close();
            return true;
        }