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; }
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; }