void ProcessSplash(PacketStream stream) { G2Header root = null; if (stream.ReadPacket(ref root)) { if (root.Name == IdentityPacket.Splash) { LargeDataPacket start = LargeDataPacket.Decode(root); if (start.Size > 0) { byte[] data = LargeDataPacket.Read(start, stream, IdentityPacket.Splash); OpSplash = (Bitmap)Bitmap.FromStream(new MemoryStream(data)); } } } }
public void Save() { if (Core != null && Core.InvokeRequired) { Debug.Assert(false); Core.RunInCoreAsync(() => Save()); return; } string backupPath = ProfilePath.Replace(".dop", ".bak"); if (!File.Exists(backupPath) && File.Exists(ProfilePath)) { File.Copy(ProfilePath, backupPath, true); } RijndaelManaged Password = new RijndaelManaged(); Password.Key = PasswordKey; try { // Attach to crypto stream and write file string tempPath = TempPath + Path.DirectorySeparatorChar + "firstsave"; if (Core != null) { tempPath = Core.GetTempPath(); } using (FileStream file = new FileStream(tempPath, FileMode.Create)) { // write encrypted part of file Password.GenerateIV(); file.Write(Password.IV, 0, Password.IV.Length); file.Write(PasswordSalt, 0, PasswordSalt.Length); using (CryptoStream crypto = new CryptoStream(file, Password.CreateEncryptor(), CryptoStreamMode.Write)) { PacketStream stream = new PacketStream(crypto, Protocol, FileAccess.Write); stream.WritePacket(Settings); if (Core != null) { if (Core.Context.Lookup != null) { Core.Context.Lookup.Network.Cache.SaveIPs(stream); Core.Context.Lookup.Network.Cache.SaveWeb(stream); } Core.Network.Cache.SaveIPs(stream); Core.Network.Cache.SaveWeb(stream); Core.SaveKeyIndex(stream); } if (OpIcon != null) { stream.WritePacket(new IconPacket(IdentityPacket.Icon, OpIcon)); } } } // write unencrypted splash using (FileStream file = new FileStream(tempPath, FileMode.Open)) { file.Seek(0, SeekOrigin.End); long startpos = file.Position; PacketStream stream = new PacketStream(file, Protocol, FileAccess.Write); // get right splash image (only used for startup logo, main setting is in link file) if (OpSplash != null) { MemoryStream mem = new MemoryStream(); OpSplash.Save(mem, ImageFormat.Jpeg); LargeDataPacket.Write(stream, IdentityPacket.Splash, mem.ToArray()); } else { LargeDataPacket.Write(stream, IdentityPacket.Splash, null); } file.WriteByte(0); // end packet stream byte[] last = BitConverter.GetBytes(startpos); file.Write(last, 0, last.Length); } File.Copy(tempPath, ProfilePath, true); File.Delete(tempPath); } catch (Exception ex) { if (Core != null) { Core.ConsoleLog("Exception Identity::Save() " + ex.Message); } else { Core.UserMessage("Profile Save Error:\n" + ex.Message + "\nBackup Restored"); } // restore backup if (File.Exists(backupPath)) { File.Copy(backupPath, ProfilePath, true); } } File.Delete(backupPath); }