/* ----------------------------------------------------------------- */ /// /// Export /// /// <summary> /// エクスポート用メッセージを生成します。 /// </summary> /// /// <param name="e">コールバック関数</param> /// /// <returns>SaveFileDialogMessage オブジェクト</returns> /// /* ----------------------------------------------------------------- */ public static SaveFileMessage Export(SaveFileCallback e) => new SaveFileMessage(e) { CheckPathExists = false, OverwritePrompt = true, Title = Properties.Resources.MessageExport, Filter = Properties.Resources.FilterOpml, };
/* ----------------------------------------------------------------- */ /// /// SaveMessage /// /// <summary> /// Creates a message to show the SaveFileDialog. /// </summary> /// /// <param name="callback"> /// Callback action when terminating the user operation. /// </param> /// /// <returns>SaveFileMessage object.</returns> /// /* ----------------------------------------------------------------- */ public static SaveFileMessage SaveMessage(SaveFileCallback callback) => new SaveFileMessage(callback) { Title = Properties.Resources.TitleSaveAs, OverwritePrompt = true, CheckPathExists = false, Filter = new[] { new ExtensionFilter(Properties.Resources.FilterPdf, true, ".pdf"), new ExtensionFilter(Properties.Resources.FilterAll, true, ".*"), }.GetFilter(), };
public void Save(string Path, SaveFileCallback callback = null) { FileStream save_stream = new FileStream(Path, FileMode.Create); try { ushort entry_count = (ushort)m_entries.Count; uint entry_len = 0; // 엔트리 리스트 길이 계산 foreach (TenshiEntry i in m_entries) { entry_len += (uint)i.EntryLength; } save_stream.Write(LittleEndian.ToEndian(entry_count), 0, 2); save_stream.Write(LittleEndian.ToEndian(entry_len), 0, 4); // 엔트리 리스트 구성 uint offset = 6 + entry_len; MemoryStream entry_list_stream = new MemoryStream((int)entry_len); TenshiRandomGenerator rand = new TenshiRandomGenerator(6 + entry_len); foreach (TenshiEntry i in m_entries) { entry_list_stream.Write(LittleEndian.ToEndian(offset), 0, 4); entry_list_stream.Write(LittleEndian.ToEndian((uint)i.Length), 0, 4); entry_list_stream.WriteByte((byte)ShiftJIS.GetByteCount(i.Entry)); entry_list_stream.Write(ShiftJIS.GetBytes(i.Entry), 0, ShiftJIS.GetByteCount(i.Entry)); i.NewOffset = offset; offset += (uint)i.Length; } // 리스트 암호화 { byte[] buf = entry_list_stream.GetBuffer(); byte key = key_base, delta = key_delta; for (uint i = 0; i < entry_len; i++) { buf[i] ^= key; key += delta; delta += key_ddelta; buf[i] ^= (byte)(rand.NextInt() & 0xff); } save_stream.Write(buf, 0, (int)entry_len); entry_list_stream.Dispose(); } // 나 쓴다 데이터 ushort count = 0; if (m_buf_queue == null) { m_buf_queue = new Queue <byte[]>(); } else { m_buf_queue.Clear(); } Thread th = new Thread(new ThreadStart(CryptThread)); th.Start(); for (ushort i = 0; i < entry_count; i++) { while (m_buf_queue.Count <= 0) { ; } byte[] buf = m_buf_queue.Dequeue(); save_stream.Write(buf, 0, buf.Length); if (callback != null) { callback(++count, entry_count); } } m_stream.Close(); } catch { } finally { save_stream.Close(); } }