74#include <wx/textfile.h>
75#include <wx/tokenzr.h>
92#define BINARY_FILE_CHECK_BUFFER_SIZE 1024
94#define DESC XO("List of Files in basic text format")
112 std::unique_ptr<ImportFileHandle>
Open(
121 const FilePath &
name, std::unique_ptr<wxTextFile> &&file);
129 Tags *tags)
override;
135 void Stop()
override;
171 const FilePath &
name, std::unique_ptr<wxTextFile> &&file)
172: mTextFile(
std::move(file))
174 , mProject{ pProject }
189 if (!binaryFile.Open(filename))
195 bool isTextFile =
false;
196 const std::string lofToken(
"file");
199 if (count > (lofToken.length() +
sizeof(
' ') + 1))
205 auto IsUtf16_BE = [](
const char*
str) ->
bool
207 return str[0] ==
static_cast<char>(0xFE) &&
str[1] ==
static_cast<char>(0xFF);
209 auto IsUtf16_LE = [](
const char*
str) ->
bool
211 return str[0] ==
static_cast<char>(0xFF) &&
str[1] ==
static_cast<char>(0xFE);
215 auto IsUtf32_BE = [](
const char*
str) ->
bool
217 return str[0] ==
static_cast<char>(0x00) &&
218 str[1] ==
static_cast<char>(0x00) &&
219 str[2] ==
static_cast<char>(0xFE) &&
220 str[3] ==
static_cast<char>(0xFF);
222 auto IsUtf32_LE = [](
const char*
str) ->
bool
224 return str[0] ==
static_cast<char>(0xFF) &&
225 str[1] ==
static_cast<char>(0xFE) &&
226 str[2] ==
static_cast<char>(0x00) &&
227 str[3] ==
static_cast<char>(0x00);
231 if (IsUtf16_BE(buf) || IsUtf16_LE(buf) || IsUtf32_BE(buf) || IsUtf32_LE(buf))
238 buf[
sizeof(buf) - 1] =
'\0';
240 std::string importedText(buf);
255 auto file = std::make_unique<wxTextFile>(filename);
258 if (!file->IsOpened())
261 return std::make_unique<LOFImportFileHandle>(
262 pProject, filename, std::move(file));
303 wxString line =
mTextFile->GetFirstLine();
340 std::make_unique< LOFImportPlugin >()
352 auto cleanup =
finally( [&]
356 pNewProject =
nullptr;
372 wxStringTokenizer tok(*ln,
wxT(
" "));
373 wxStringTokenizer temptok1(*ln,
wxT(
"\""));
374 wxStringTokenizer temptok2(*ln,
wxT(
" "));
378 wxString tokenholder = tok.GetNextToken();
381 if (tokenholder.IsSameAs(
wxT(
"window"),
false))
392 while (tok.HasMoreTokens())
394 tokenholder = tok.GetNextToken();
396 if (tokenholder.IsSameAs(
wxT(
"offset"),
false))
398 if (tok.HasMoreTokens())
399 tokenholder = tok.GetNextToken();
409 XO(
"Invalid window offset in LOF file."));
412 if (tok.HasMoreTokens())
413 tokenholder = tok.GetNextToken();
416 if (tokenholder.IsSameAs(
wxT(
"duration"),
false))
418 if (tok.HasMoreTokens())
419 tokenholder = tok.GetNextToken();
429 XO(
"Invalid duration in LOF file."));
433 if (tokenholder ==
wxT(
"#"))
436 tok = wxStringTokenizer(
wxT(
""),
wxT(
" "));
441 else if (tokenholder.IsSameAs(
wxT(
"file"),
false))
445 tokenholder = temptok1.GetNextToken();
446 wxString targettoken = temptok1.GetNextToken();
447 targetfile = targettoken;
450 if(!wxIsAbsolutePath(targetfile)) {
451 wxFileName fName(targetfile);
452 fName.Normalize(wxPATH_NORM_ALL,
mLOFFileName.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR));
453 if(fName.FileExists()) {
454 targetfile = fName.GetFullPath();
479 temptok2.SetString(targettoken);
480 tokenplace = temptok2.CountTokens();
482 for (
int i = 0; i < tokenplace; i++)
483 tokenholder = tok.GetNextToken();
485 if (tok.HasMoreTokens())
487 tokenholder = tok.GetNextToken();
489 if (tokenholder ==
wxT(
"#"))
492 tok = wxStringTokenizer(
wxT(
""),
wxT(
" "));
495 if (tokenholder.IsSameAs(
wxT(
"offset"),
false))
497 if (tok.HasMoreTokens())
498 tokenholder = tok.GetNextToken();
509 auto t = *
tracks.rbegin();
517 if (targetfile.AfterLast(
wxT(
'.')).IsSameAs(
wxT(
"mid"),
false) ||
518 targetfile.AfterLast(
wxT(
'.')).IsSameAs(
wxT(
"midi"),
false))
533 XO(
"Invalid track offset in LOF file."));
539 else if (tokenholder ==
wxT(
"#"))
542 tok = wxStringTokenizer(
wxT(
""),
wxT(
" "));
const TranslatableString name
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....
std::vector< std::shared_ptr< TrackList > > TrackHolders
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 ...
accessors for certain important windows associated with each project
std::vector< TranslatableString > TranslatableStrings
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Base class for FlacImportFileHandle, LOFImportFileHandle, MP3ImportFileHandle, OggImportFileHandle an...
unsigned long long ByteCount
Base class for FlacImportPlugin, LOFImportPlugin, MP3ImportPlugin, OggImportPlugin and PCMImportPlugi...
Interface used to report on import state and progress.
virtual void OnImportResult(ImportResult result)=0
Used to report on import result for file handle passed as argument to OnImportFileOpened.
static void ShowMessageBox(const TranslatableString &message, const TranslatableString &caption=XO("Import Project"))
static bool CompatibleToDouble(const wxString &stringToConvert, double *result)
Convert a string to a number.
An ImportFileHandle for LOF data.
const TranslatableStrings & GetStreamInfo() override
const wxFileName mLOFFileName
void Import(ImportProgressListener &progressListener, WaveTrackFactory *trackFactory, TrackHolders &outTracks, Tags *tags) 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
FilePath GetFilename() const override
std::unique_ptr< wxTextFile > mTextFile
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
Return the greatest end time of the tracks, or 0 when no tracks.
static TrackList & Get(AudacityProject &project)
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.
constexpr size_t npos(-1)