74#include <wx/textfile.h>
75#include <wx/tokenzr.h>
86#include "../ProjectManager.h"
87#include "../ProjectWindow.h"
88#include "../ProjectWindows.h"
93#define BINARY_FILE_CHECK_BUFFER_SIZE 1024
95#define DESC XO("List of Files in basic text format")
113 std::unique_ptr<ImportFileHandle>
Open(
122 const FilePath &
name, std::unique_ptr<wxTextFile> &&file);
128 Tags *tags)
override;
164 const FilePath &
name, std::unique_ptr<wxTextFile> &&file)
166 , mTextFile(
std::move(file))
168 , mProject{ pProject }
183 if (!binaryFile.Open(filename))
189 bool isTextFile =
false;
190 const std::string lofToken(
"file");
193 if (count > (lofToken.length() +
sizeof(
' ') + 1))
199 auto IsUtf16_BE = [](
const char*
str) ->
bool
201 return str[0] ==
static_cast<char>(0xFE) &&
str[1] ==
static_cast<char>(0xFF);
203 auto IsUtf16_LE = [](
const char*
str) ->
bool
205 return str[0] ==
static_cast<char>(0xFF) &&
str[1] ==
static_cast<char>(0xFE);
209 auto IsUtf32_BE = [](
const char*
str) ->
bool
211 return str[0] ==
static_cast<char>(0x00) &&
212 str[1] ==
static_cast<char>(0x00) &&
213 str[2] ==
static_cast<char>(0xFE) &&
214 str[3] ==
static_cast<char>(0xFF);
216 auto IsUtf32_LE = [](
const char*
str) ->
bool
218 return str[0] ==
static_cast<char>(0xFF) &&
219 str[1] ==
static_cast<char>(0xFE) &&
220 str[2] ==
static_cast<char>(0x00) &&
221 str[3] ==
static_cast<char>(0x00);
225 if (IsUtf16_BE(buf) || IsUtf16_LE(buf) || IsUtf32_BE(buf) || IsUtf32_LE(buf))
232 buf[
sizeof(buf) - 1] =
'\0';
234 std::string importedText(buf);
236 if (importedText.find(lofToken) != std::string::npos)
249 auto file = std::make_unique<wxTextFile>(filename);
252 if (!file->IsOpened())
255 return std::make_unique<LOFImportFileHandle>(
256 pProject, filename, std::move(file));
271 Tags * WXUNUSED(tags))
292 return ProgressResult::Failed;
295 wxString line =
mTextFile->GetFirstLine();
307 return ProgressResult::Failed;
316 std::make_unique< LOFImportPlugin >()
328 auto cleanup =
finally( [&]
332 pNewProject =
nullptr;
348 wxStringTokenizer tok(*ln,
wxT(
" "));
349 wxStringTokenizer temptok1(*ln,
wxT(
"\""));
350 wxStringTokenizer temptok2(*ln,
wxT(
" "));
354 wxString tokenholder = tok.GetNextToken();
357 if (tokenholder.IsSameAs(
wxT(
"window"),
false))
368 while (tok.HasMoreTokens())
370 tokenholder = tok.GetNextToken();
372 if (tokenholder.IsSameAs(
wxT(
"offset"),
false))
374 if (tok.HasMoreTokens())
375 tokenholder = tok.GetNextToken();
385 XO(
"Invalid window offset in LOF file."),
391 if (tok.HasMoreTokens())
392 tokenholder = tok.GetNextToken();
395 if (tokenholder.IsSameAs(
wxT(
"duration"),
false))
397 if (tok.HasMoreTokens())
398 tokenholder = tok.GetNextToken();
408 XO(
"Invalid duration in LOF file."),
415 if (tokenholder ==
wxT(
"#"))
418 tok = wxStringTokenizer(
wxT(
""),
wxT(
" "));
423 else if (tokenholder.IsSameAs(
wxT(
"file"),
false))
427 tokenholder = temptok1.GetNextToken();
428 wxString targettoken = temptok1.GetNextToken();
429 targetfile = targettoken;
432 if(!wxIsAbsolutePath(targetfile)) {
433 wxFileName fName(targetfile);
434 fName.Normalize(wxPATH_NORM_ALL,
mLOFFileName.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR));
435 if(fName.FileExists()) {
436 targetfile = fName.GetFullPath();
461 temptok2.SetString(targettoken);
462 tokenplace = temptok2.CountTokens();
464 for (
int i = 0; i < tokenplace; i++)
465 tokenholder = tok.GetNextToken();
467 if (tok.HasMoreTokens())
469 tokenholder = tok.GetNextToken();
471 if (tokenholder ==
wxT(
"#"))
474 tok = wxStringTokenizer(
wxT(
""),
wxT(
" "));
477 if (tokenholder.IsSameAs(
wxT(
"offset"),
false))
479 if (tok.HasMoreTokens())
480 tokenholder = tok.GetNextToken();
491 auto t = *tracks.Leaders().rbegin();
499 if (targetfile.AfterLast(
wxT(
'.')).IsSameAs(
wxT(
"mid"),
false) ||
500 targetfile.AfterLast(
wxT(
'.')).IsSameAs(
wxT(
"midi"),
false))
503 XO(
"MIDI tracks cannot be offset individually, only audio files can be."),
511 channel->SetOffset(offset);
521 XO(
"Invalid track offset in LOF file."),
530 else if (tokenholder ==
wxT(
"#"))
533 tok = wxStringTokenizer(
wxT(
""),
wxT(
" "));
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
const TranslatableString name
std::vector< std::vector< std::shared_ptr< WaveTrack > > > TrackHolders
static Importer::RegisteredImportPlugin registered
static AudacityProject * DoImportMIDIProject(AudacityProject *pProject, const FilePath &fileName)
#define BINARY_FILE_CHECK_BUFFER_SIZE
bool DoImportMIDI(AudacityProject &project, const FilePath &fileName)
The interface that all file import "plugins" (if you want to call them that) must implement....
AUDACITY_DLL_API wxFrame & GetProjectFrame(AudacityProject &project)
Get the top-level window associated with the project (as a wxFrame only, when you do not need to use ...
std::vector< TranslatableString > TranslatableStrings
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
An ImportFileHandle for data.
unsigned long long ByteCount
Base class for FlacImportPlugin, LOFImportPlugin, MP3ImportPlugin, OggImportPlugin and PCMImportPlugi...
static bool CompatibleToDouble(const wxString &stringToConvert, double *result)
Convert a string to a number.
An ImportFileHandle for LOF data.
const TranslatableStrings & GetStreamInfo() override
void SetStreamUsage(wxInt32 WXUNUSED(StreamID), bool WXUNUSED(Use)) override
void lofOpenFiles(wxString *ln)
Processes a single line from a LOF text file, doing whatever is indicated on the line.
LOFImportFileHandle(AudacityProject *pProject, const FilePath &name, std::unique_ptr< wxTextFile > &&file)
ByteCount GetFileUncompressedBytes() override
std::unique_ptr< wxTextFile > mTextFile
ProgressResult Import(WaveTrackFactory *trackFactory, TrackHolders &outTracks, Tags *tags) override
wxInt32 GetStreamCount() override
AudacityProject * mProject
void doDurationAndScrollOffset()
TranslatableString GetFileDescription() override
An ImportPlugin for LOF data.
std::unique_ptr< ImportFileHandle > Open(const FilePath &Filename, AudacityProject *pProject) override
TranslatableString GetPluginFormatDescription() override
wxString GetPluginStringID() override
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)
static AudacityProject * New()
static AudacityProject * OpenProject(AudacityProject *pGivenProject, const FilePath &fileNameArg, bool addtohistory, bool reuseNonemptyProject)
Open a file into an AudacityProject, returning the project, or nullptr for failure.
void ZoomBy(double multiplier)
static ProjectWindow & Get(AudacityProject &project)
void TP_ScrollWindow(double scrollto) override
double GetEndTime() const
static TrackList & Get(AudacityProject &project)
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
Holds a msgid for the translation catalog; may also bind format arguments.
Used to create or clone a WaveTrack, with appropriate context from the project that will own the trac...
Extend wxArrayString with move operations and construction and insertion fromstd::initializer_list.
FILES_API bool IsMidi(const FilePath &fName)
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.