/// <summary> /// Expends filename with full path and extension /// </summary> /// <param name="in_filename">TVC filename</param> /// <returns>Full path unicode filename</returns> private string GetFilePath(string in_filename) { string filename = TVCCharacterCodePage.TVCStringToUNICODEString(in_filename); if (string.IsNullOrEmpty(Path.GetExtension(filename))) { filename = filename + ".CAS"; } string path = Path.Combine(CoProc.Cart.Settings.FilesystemFolder, filename); return(path); }
private void StoreRootPathInfo(ref int in_buffer_pos) { string root_folder = "\\Defaultpath"; int length = 0; m_line_number = 1; // header 1 Array.Copy(m_path_header1, 0, m_directory_buffer, in_buffer_pos, m_path_header1.Length); length += m_path_header1.Length; // path int pos = 0; while (pos < root_folder.Length && pos < MaxPathLineLength) { m_directory_buffer[in_buffer_pos + length] = (byte)TVCCharacterCodePage.UNICODECharToTVCChar(root_folder[pos]); pos++; length++; } // header 2 Array.Copy(m_path_header2, 0, m_directory_buffer, in_buffer_pos + length, m_path_header2.Length); length += m_path_header2.Length; while (pos < MaxPathLineLength + 1) { m_directory_buffer[in_buffer_pos + length] = (byte)' '; pos++; length++; } // footer Array.Copy(m_path_footer, 0, m_directory_buffer, in_buffer_pos + length, m_path_footer.Length); length += m_path_footer.Length; // update basic line length m_directory_buffer[in_buffer_pos] = (byte)length; in_buffer_pos += length; }
private void StoreFileInfo(ref int in_buffer_pos, FileInfo in_file_info) { string name = Path.GetFileNameWithoutExtension(in_file_info.Name); // line length m_directory_buffer[in_buffer_pos++] = 2 + DirectoryFileNameLength + DirectoryExensionLength + 2 + 1; // line number+file name+extension+apostrophes+0xff // store file length in kb int file_length = (int)((in_file_info.Length + 1023) / 1024); m_directory_buffer[in_buffer_pos++] = (byte)(file_length % 256); m_directory_buffer[in_buffer_pos++] = (byte)(file_length / 256); m_directory_buffer[in_buffer_pos++] = (byte)'\"'; // filename if (name.Length > DirectoryFileNameLength) { // handle long filename for (int i = 0; i < name.Length && i < DirectoryFileNameLength; i++) { m_directory_buffer[in_buffer_pos++] = (byte)TVCCharacterCodePage.UNICODECharToTVCChar(name[i]); } m_directory_buffer[in_buffer_pos++] = (byte)'\"'; } else { // copy short filename for (int i = 0; i < DirectoryFileNameLength; i++) { if (i < name.Length) { m_directory_buffer[in_buffer_pos++] = (byte)TVCCharacterCodePage.UNICODECharToTVCChar(name[i]); } else { if (i == name.Length) { m_directory_buffer[in_buffer_pos++] = (byte)'\"'; } m_directory_buffer[in_buffer_pos++] = (byte)' '; } } } // extension string extension = in_file_info.Extension.Substring(1); for (int i = 0; i < DirectoryExensionLength; i++) { if (i < extension.Length) { m_directory_buffer[in_buffer_pos++] = (byte)TVCCharacterCodePage.UNICODECharToTVCChar(extension[i]); } else { m_directory_buffer[in_buffer_pos++] = (byte)' '; } } // line terminator m_directory_buffer[in_buffer_pos++] = 0xff; }
private void StoreFileInfo(ref int in_buffer_pos, FileInfo in_file_info) { string name = Path.GetFileNameWithoutExtension(in_file_info.Name); int length = 0; // header 1 Array.Copy(m_filename_header1, 0, m_directory_buffer, in_buffer_pos, m_filename_header1.Length); length += m_filename_header1.Length; // update basic line number m_directory_buffer[in_buffer_pos + 1] = (byte)(m_line_number % 256); m_directory_buffer[in_buffer_pos + 2] = (byte)(m_line_number / 256); // store file length in kb int file_length = (int)((in_file_info.Length + 1023) / 1024); if (file_length > 999) { m_directory_buffer[in_buffer_pos + 6] = (byte)'x'; m_directory_buffer[in_buffer_pos + 7] = (byte)'x'; m_directory_buffer[in_buffer_pos + 8] = (byte)'x'; } else { if (file_length >= 100) { m_directory_buffer[in_buffer_pos + 6] = (byte)(file_length / 100 + '0'); } if (file_length >= 10) { m_directory_buffer[in_buffer_pos + 7] = (byte)((file_length % 100) / 10 + '0'); } m_directory_buffer[in_buffer_pos + 8] = (byte)(file_length % 10 + '0'); } // store filename int pos = 0; while (pos < name.Length && pos < DirectoryFileNameLength) { m_directory_buffer[in_buffer_pos + length] = (byte)TVCCharacterCodePage.UNICODECharToTVCChar(name[pos]); pos++; length++; } // header 2 Array.Copy(m_filename_header2, 0, m_directory_buffer, in_buffer_pos + length, m_filename_header2.Length); length += m_filename_header2.Length; // padding filename with spaces while (pos < DirectoryFileNameLength + 1) { m_directory_buffer[in_buffer_pos + length] = (byte)' '; pos++; length++; } // extension string extension = in_file_info.Extension.Substring(1); for (int i = 0; i < DirectoryExensionLength; i++) { if (i < extension.Length) { m_directory_buffer[in_buffer_pos + length] = (byte)TVCCharacterCodePage.UNICODECharToTVCChar(extension[i]); } else { m_directory_buffer[in_buffer_pos + length] = (byte)' '; } length++; } // header 2 Array.Copy(m_filename_footer, 0, m_directory_buffer, in_buffer_pos + length, m_filename_footer.Length); length += m_filename_footer.Length; // update basic line length m_directory_buffer[in_buffer_pos] = (byte)length; in_buffer_pos += length; m_line_number++; }
/// <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++; }