diff --git a/headers/private/storage/CopyEngine.h b/headers/private/storage/CopyEngine.h index f2529c944c..aed78bf233 100644 --- a/headers/private/storage/CopyEngine.h +++ b/headers/private/storage/CopyEngine.h @@ -11,7 +11,7 @@ #include -#include +#include class BFile; @@ -21,7 +21,7 @@ class BNode; namespace BPrivate { -class BCopyEngine { +class BCopyEngine : public BEntryOperationEngineBase { public: class BController; @@ -43,8 +43,8 @@ public: BCopyEngine& AddFlags(uint32 flags); BCopyEngine& RemoveFlags(uint32 flags); - status_t CopyEntry(const char* sourcePath, - const char* destPath); + status_t CopyEntry(const Entry& sourceEntry, + const Entry& destEntry); private: status_t _CopyEntry(const char* sourcePath, diff --git a/headers/private/storage/EntryOperationEngineBase.h b/headers/private/storage/EntryOperationEngineBase.h new file mode 100644 index 0000000000..0c64d3217d --- /dev/null +++ b/headers/private/storage/EntryOperationEngineBase.h @@ -0,0 +1,55 @@ +/* + * Copyright 2013, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Ingo Weinhold + */ +#ifndef _ENTRY_OPERATION_ENGINE_BASE_H +#define _ENTRY_OPERATION_ENGINE_BASE_H + + +#include + + +class BDirectory; +class BEntry; +class BPath; + +struct entry_ref; + + +namespace BPrivate { + + +class BEntryOperationEngineBase { +public: + class Entry; +}; + + +class BEntryOperationEngineBase::Entry { +public: + Entry(const char* path); + Entry(const BDirectory& directory, + const char* path = NULL); + Entry(const BEntry& entry); + Entry(const entry_ref& entryRef); + ~Entry(); + + status_t GetPath(BPath& buffer, const char*& _path) + const; + BString Path() const; + +private: + const BDirectory* fDirectory; + const char* fPath; + const BEntry* fEntry; + const entry_ref* fEntryRef; +}; + + +} // namespace BPrivate + + +#endif // _ENTRY_OPERATION_ENGINE_BASE_H diff --git a/src/kits/storage/CopyEngine.cpp b/src/kits/storage/CopyEngine.cpp index 7848297e5a..dea733fb7e 100644 --- a/src/kits/storage/CopyEngine.cpp +++ b/src/kits/storage/CopyEngine.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -97,7 +96,7 @@ BCopyEngine::RemoveFlags(uint32 flags) status_t -BCopyEngine::CopyEntry(const char* sourcePath, const char* destPath) +BCopyEngine::CopyEntry(const Entry& sourceEntry, const Entry& destEntry) { if (fBuffer == NULL) { fBuffer = new(std::nothrow) char[kDefaultBufferSize]; @@ -112,6 +111,18 @@ BCopyEngine::CopyEntry(const char* sourcePath, const char* destPath) fBufferSize = kDefaultBufferSize; } + BPath sourcePathBuffer; + const char* sourcePath; + status_t error = sourceEntry.GetPath(sourcePathBuffer, sourcePath); + if (error != B_OK) + return error; + + BPath destPathBuffer; + const char* destPath; + error = destEntry.GetPath(destPathBuffer, destPath); + if (error != B_OK) + return error; + return _CopyEntry(sourcePath, destPath); } diff --git a/src/kits/storage/EntryOperationEngineBase.cpp b/src/kits/storage/EntryOperationEngineBase.cpp new file mode 100644 index 0000000000..25fd8efd03 --- /dev/null +++ b/src/kits/storage/EntryOperationEngineBase.cpp @@ -0,0 +1,99 @@ +/* + * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include + +#include +#include +#include + + +namespace BPrivate { + + +BEntryOperationEngineBase::Entry::Entry(const char* path) + : + fDirectory(NULL), + fPath(path), + fEntry(NULL), + fEntryRef(NULL) + +{ +} + + +BEntryOperationEngineBase::Entry::Entry(const BDirectory& directory, const char* path) + : + fDirectory(&directory), + fPath(path), + fEntry(NULL), + fEntryRef(NULL) +{ +} + + +BEntryOperationEngineBase::Entry::Entry(const BEntry& entry) + : + fDirectory(NULL), + fPath(NULL), + fEntry(&entry), + fEntryRef(NULL) +{ +} + + +BEntryOperationEngineBase::Entry::Entry(const entry_ref& entryRef) + : + fDirectory(NULL), + fPath(NULL), + fEntry(NULL), + fEntryRef(&entryRef) +{ +} + + +BEntryOperationEngineBase::Entry::~Entry() +{ +} + + +status_t +BEntryOperationEngineBase::Entry::GetPath(BPath& buffer, const char*& _path) + const +{ + status_t error; + + if (fEntry != NULL) { + error = buffer.SetTo(fEntry); + } else if (fDirectory != NULL) { + error = buffer.SetTo(fDirectory, fPath); + } else if (fEntryRef != NULL) { + error = buffer.SetTo(fEntryRef); + } else if (fPath != NULL) { + _path = fPath; + return B_OK; + } + + if (error != B_OK) + return error; + + _path = buffer.Path(); + return B_OK; +} + + +BString +BEntryOperationEngineBase::Entry::Path() const +{ + BPath pathBuffer; + const char* path; + if (GetPath(pathBuffer, path) == B_OK) + return BString(path); + return BString(); +} + + +} // namespace BPrivate diff --git a/src/kits/storage/Jamfile b/src/kits/storage/Jamfile index af98f93aeb..68c54d8aeb 100644 --- a/src/kits/storage/Jamfile +++ b/src/kits/storage/Jamfile @@ -26,6 +26,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { DriverSettings.cpp Entry.cpp EntryList.cpp + EntryOperationEngineBase.cpp File.cpp FileDescriptorIO.cpp FileIO.cpp