/// <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++; }
/// <summary> /// Opens file for reading /// </summary> /// <param name="in_data">Function parameter bytes</param> private void CasOpen(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) { if (m_filename_param == "+") { m_read_mode = FileReadMode.Directory; m_directory_file.Open(); m_filename_param = "+"; SetReadResult(CoProcessorReadFilename); } else { if (m_read_stream == null) { // Last filename character received m_read_mode = FileReadMode.File; string filename; if (m_filename_length_param == 0) { filename = GetFilePath("start"); } else { filename = GetFilePath(m_filename_param); } if (!File.Exists(filename)) { EndFunction(CoProcessorConstants.ERR_FILE_NOT_FOUND); } else { if (!Directory.Exists(Path.GetDirectoryName(filename))) { EndFunction(CoProcessorConstants.ERR_NO_PATH); } else { // try to open the file try { m_read_stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); m_read_file = new BinaryReader(m_read_stream); // In case of CAS file skip UPM header if (string.Compare(Path.GetExtension(filename), ".CAS", true) == 0) { m_read_stream.Seek(Marshal.SizeOf(typeof(TVCFileTypes.CASUPMHeaderType)), SeekOrigin.Begin); } // generate result file name filename = Path.GetFileName(filename); if (filename.Length < m_filename_length_param) { m_filename_length_param = filename.Length; } m_filename_param = TVCCharacterCodePage.UNICODEStringToTVCString(filename); SetReadResult(CoProcessorReadFilename); } catch { EndFunction(CoProcessorConstants.ERR_FILE_NOT_FOUND); } } } } else { // if file is already created EndFunction(CoProcessorConstants.ERR_ALREADY_OPENED); } } } m_write_data_index++; }