/////////////////////////////////////////////////////////////////////////////// // Saves CAS file public static void CASSave(Stream in_file, ProgramStorage in_storage) { using (BinaryWriter cas_file = new BinaryWriter(in_file)) { TVCFileTypes.CASUPMHeaderType upm_header = CreateUPMHeader(in_storage); TVCFileTypes.CASProgramFileHeaderType program_header = CreateProgramFileHeader(in_storage); cas_file.Write(upm_header); cas_file.Write(program_header); cas_file.Write(in_storage.Data, 0, in_storage.Length); } }
/////////////////////////////////////////////////////////////////////////////// // Initizes UPM header public static TVCFileTypes.CASUPMHeaderType CreateUPMHeader(ProgramStorage in_storage) { TVCFileTypes.CASUPMHeaderType header = new TVCFileTypes.CASUPMHeaderType(); ushort cas_length = (ushort)(in_storage.Length + Marshal.SizeOf(typeof(TVCFileTypes.CASUPMHeaderType)) + Marshal.SizeOf(typeof(TVCFileTypes.CASProgramFileHeaderType))); header.FileType = TVCFileTypes.CASBlockHeaderFileUnbuffered; header.CopyProtect = (byte)((in_storage.CopyProtect) ? 0xff : 0x00); header.BlockNumber = (ushort)(cas_length / 128); header.LastBlockBytes = (byte)(cas_length % 128); return(header); }
/// <summary> /// Closes opened file after write /// </summary> private void CasCloseWrite() { if (m_write_file != null) { try { if (m_write_mode == FileWriteMode.CASFile) { // read back cas header BinaryReader reader = new BinaryReader(m_write_stream); reader.BaseStream.Seek(Marshal.SizeOf(typeof(TVCFileTypes.CASUPMHeaderType)), SeekOrigin.Begin); TVCFileTypes.CASProgramFileHeaderType program_header = new TVCFileTypes.CASProgramFileHeaderType(); reader.Read(program_header); // in case of cas file update header TVCFileTypes.CASUPMHeaderType upm_header = new TVCFileTypes.CASUPMHeaderType(); ushort cas_length = (ushort)(program_header.FileLength + Marshal.SizeOf(typeof(TVCFileTypes.CASUPMHeaderType)) + Marshal.SizeOf(typeof(TVCFileTypes.CASProgramFileHeaderType))); upm_header.FileType = TVCFileTypes.CASBlockHeaderFileUnbuffered; upm_header.CopyProtect = 0; upm_header.BlockNumber = (byte)(cas_length / 128); upm_header.LastBlockBytes = (byte)(cas_length % 128); m_write_file.Seek(0, SeekOrigin.Begin); m_write_file.Write(upm_header); } m_write_file.Close(); m_write_stream.Close(); EndFunction(CoProcessorConstants.ERR_OK); } catch { EndFunction(CoProcessorConstants.ERR_DISK_FULL); } finally { m_write_file = null; m_write_stream = null; } } else { EndFunction(CoProcessorConstants.ERR_NO_OPENED_FILE); } }
/////////////////////////////////////////////////////////////////////////////// // Loads CAS file public static void CASLoad(Stream in_file, ProgramStorage in_storage) { TVCFileTypes.CASUPMHeaderType upm_header = new TVCFileTypes.CASUPMHeaderType(); TVCFileTypes.CASProgramFileHeaderType program_header = new TVCFileTypes.CASProgramFileHeaderType(); // open CAS file using (BinaryReader cas_file = new BinaryReader(in_file)) { // load UPM header cas_file.Read(upm_header); // load program header cas_file.Read(program_header); // Check validity if (!CASCheckHeaderValidity(program_header)) { throw new FileFormatException("Invalid CAS header"); } if (!CASCheckUPMHeaderValidity(upm_header)) { throw new FileFormatException("Invalid UPM header"); } cas_file.Read(in_storage.Data, 0, program_header.FileLength); in_storage.Length = program_header.FileLength; in_storage.CopyProtect = (upm_header.CopyProtect != 0); in_storage.AutoStart = (program_header.Autorun != 0); in_storage.SetFileTypeByte(program_header.FileType); } // generate TVC filename //PCToTVCFilename(g_db_file_name, in_file_name); }
/////////////////////////////////////////////////////////////////////////////// // Checks UPM header validity public static bool CASCheckUPMHeaderValidity(TVCFileTypes.CASUPMHeaderType in_header) { return(in_header.FileType == TVCFileTypes.CASBlockHeaderFileUnbuffered); }
/// <summary> /// Creates file for write /// </summary> /// <param name="in_data">Function parameter bytes</param> private void CasCreate(byte in_data) { if (m_write_data_index == 0) { m_filename_length_param = in_data; m_filename_param = ""; } // store filename character int filename_index = m_write_data_index - 1; if (filename_index >= 0 && filename_index < m_filename_length_param) { m_filename_param += (char)in_data; } // if last character is received if (filename_index + 1 == m_filename_length_param) { // create file if (m_write_file == null) { string filename = GetFilePath(m_filename_param); if (File.Exists(filename)) { EndFunction(CoProcessorConstants.ERR_FILE_EXISTS); } else { if (!Directory.Exists(Path.GetDirectoryName(filename))) { EndFunction(CoProcessorConstants.ERR_NO_PATH); } else { // try to create file try { m_write_stream = File.Open(filename, FileMode.Create, FileAccess.ReadWrite); m_write_file = new BinaryWriter(m_write_stream); // In case of CAS file write UPM header if (string.Compare(Path.GetExtension(filename), ".CAS", true) == 0) { m_write_mode = FileWriteMode.CASFile; // create and write empty upm header (close will update it) TVCFileTypes.CASUPMHeaderType upm_header = new TVCFileTypes.CASUPMHeaderType(); upm_header.FileType = TVCFileTypes.CASBlockHeaderFileUnbuffered; upm_header.CopyProtect = 0; upm_header.BlockNumber = 0; upm_header.LastBlockBytes = 0; m_write_file.Write(upm_header); } else { m_write_mode = FileWriteMode.File; } // gererate result file name filename = Path.GetFileNameWithoutExtension(filename); m_filename_param = TVCCharacterCodePage.UNICODEStringToTVCString(filename); SetReadResult(CoProcessorReadFilename); } catch { EndFunction(CoProcessorConstants.ERR_FILE_EXISTS); } } } } else { // if file is already created EndFunction(CoProcessorConstants.ERR_ALREADY_OPENED); } } m_write_data_index++; }