diff options
Diffstat (limited to 'include/store')
-rw-r--r-- | include/store/store.h | 217 | ||||
-rw-r--r-- | include/store/store.hxx | 353 | ||||
-rw-r--r-- | include/store/storedllapi.h | 29 | ||||
-rw-r--r-- | include/store/types.h | 130 |
4 files changed, 729 insertions, 0 deletions
diff --git a/include/store/store.h b/include/store/store.h new file mode 100644 index 000000000..2fdfa4a30 --- /dev/null +++ b/include/store/store.h @@ -0,0 +1,217 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <store/storedllapi.h> +#include <store/types.h> +#include <rtl/ustring.h> +#include <sal/types.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** Handle opaque type. + */ +typedef void* storeHandle; + +/** Acquire a Handle. + @param Handle [in] the Handle. + @return store_E_None upon success + */ +STORE_DLLPUBLIC storeError store_acquireHandle ( + storeHandle Handle +) SAL_THROW_EXTERN_C(); + +/** Release a Handle. + @param Handle [in] the Handle. + @return store_E_None upon success, + store_E_InvalidHandle otherwise. + */ +STORE_DLLPUBLIC storeError store_releaseHandle ( + storeHandle Handle +) SAL_THROW_EXTERN_C(); + +/** File Handle opaque type. + */ +typedef void* storeFileHandle; + +/** Open a temporary file in memory. + @param nPageSize [in] the creation page size, + integer multiple of minimum page size. + @param phFile [out] the File Handle. + @return store_E_None upon success + */ +STORE_DLLPUBLIC storeError store_createMemoryFile ( + sal_uInt16 nPageSize, + storeFileHandle *phFile +) SAL_THROW_EXTERN_C(); + +/** Open a file. + @param pFilename [in] the filename as URL or system path. + @param eAccessMode [in] the access mode. + storeAccessMode::Create truncate existing and create, + store_AccessReadCreate create not existing, + storeAccessMode::ReadWrite write existing, + storeAccessMode::ReadOnly never modifies. + @param nPageSize [in] the creation page size, + integer multiple of minimum page size. + @param phFile [out] the File Handle. + @return store_E_None upon success + */ +STORE_DLLPUBLIC storeError store_openFile ( + rtl_uString *pFilename, + storeAccessMode eAccessMode, + sal_uInt16 nPageSize, + storeFileHandle *phFile +) SAL_THROW_EXTERN_C(); + +/** Close a file. + @param hFile [in] the File Handle. + @return store_E_None upon success, + store_E_InvalidHandle otherwise. + */ +STORE_DLLPUBLIC storeError store_closeFile ( + storeFileHandle hFile +) SAL_THROW_EXTERN_C(); + +/** Flush a file. + @param hFile [in] the File Handle. + @return store_E_None upon success + */ +STORE_DLLPUBLIC storeError store_flushFile ( + storeFileHandle hFile +) SAL_THROW_EXTERN_C(); + +/** Directory Handle opaque type. + */ +typedef void* storeDirectoryHandle; + +/** Open a directory. + @see store_openFile() + + @param hFile [in] the File Handle. + @param pPath [in] the directory path. + @param pName [in] the directory name. + @param eAccessMode [in] the access mode. + @param phDirectory [out] the Directory Handle. + @return store_E_None upon success + */ +STORE_DLLPUBLIC storeError store_openDirectory ( + storeFileHandle hFile, + rtl_uString const *pPath, + rtl_uString const *pName, + storeAccessMode eAccessMode, + storeDirectoryHandle *phDirectory +) SAL_THROW_EXTERN_C(); + +/** Find first directory entry. + @param hDirectory [in] the Directory Handle. + @param pFindData [out] the Find Data structure. + @return store_E_None upon success, + store_E_NoMoreFile upon end of iteration. + */ +STORE_DLLPUBLIC storeError store_findFirst ( + storeDirectoryHandle hDirectory, + storeFindData *pFindData +) SAL_THROW_EXTERN_C(); + +/** Find next directory entry. + @param hDirectory [in] the Directory Handle. + @param pFindData [out] the Find Data structure. + @return store_E_None upon success, + store_E_NoMoreFile upon end of iteration. + */ +STORE_DLLPUBLIC storeError store_findNext ( + storeDirectoryHandle hDirectory, + storeFindData *pFindData +) SAL_THROW_EXTERN_C(); + +/** Stream Handle opaque type. + */ +typedef void* storeStreamHandle; + +/** Open a stream. + @see store_openFile() + + @param hFile [in] the File Handle. + @param pPath [in] the stream path. + @param pName [in] the stream name. + @param eMode [in] the access mode. + @param phStrm [out] the Stream Handle. + @return store_E_None upon success + */ +STORE_DLLPUBLIC storeError store_openStream ( + storeFileHandle hFile, + rtl_uString const *pPath, + rtl_uString const *pName, + storeAccessMode eMode, + storeStreamHandle *phStrm +) SAL_THROW_EXTERN_C(); + +/** Read from a stream. + @param hStrm [in] the Stream Handle. + @param nOffset [in] the offset of the first byte to read. + @param pBuffer [out] the buffer. + @param nBytes [in] the number of bytes to read. + @param pnDone [out] the number of bytes actually read. + @return store_E_None upon success + */ +STORE_DLLPUBLIC storeError store_readStream ( + storeStreamHandle hStrm, + sal_uInt32 nOffset, + void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 *pnDone +) SAL_THROW_EXTERN_C(); + +/** Write to a stream. + @param hStrm [in] the Stream Handle. + @param nOffset [in] the offset of the first byte to write. + @param pBuffer [in] the buffer. + @param nBytes [in] the number of bytes to write. + @param pnDone [out] the number of bytes actually written. + @return store_E_None upon success + */ +STORE_DLLPUBLIC storeError store_writeStream ( + storeStreamHandle hStrm, + sal_uInt32 nOffset, + const void *pBuffer, + sal_uInt32 nBytes, + sal_uInt32 *pnDone +) SAL_THROW_EXTERN_C(); + +/** Remove a file entry. + @param hFile [in] the File Handle + @param pPath [in] the entry path + @param pName [in] the entry name + @return store_E_None upon success + */ +STORE_DLLPUBLIC storeError store_remove ( + storeFileHandle hFile, + rtl_uString const *pPath, + rtl_uString const *pName +) SAL_THROW_EXTERN_C(); + +#ifdef __cplusplus +} +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/store/store.hxx b/include/store/store.hxx new file mode 100644 index 000000000..d32ceefbe --- /dev/null +++ b/include/store/store.hxx @@ -0,0 +1,353 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <store/store.h> +#include <sal/types.h> +#include <rtl/ustring.hxx> +#include <store/types.h> + +namespace store +{ + +class OStoreStream +{ +public: + /** Construction. + */ + OStoreStream() + : m_hImpl (nullptr) + {} + + /** Destruction. + */ + ~OStoreStream() + { + if (m_hImpl) + (void) store_releaseHandle (m_hImpl); + } + + /** Copy construction. + */ + OStoreStream (OStoreStream const & rhs) + : m_hImpl (rhs.m_hImpl) + { + if (m_hImpl) + (void) store_acquireHandle (m_hImpl); + } + + /** Assignment. + */ + OStoreStream & operator= (OStoreStream const & rhs) + { + if (rhs.m_hImpl) + (void) store_acquireHandle (rhs.m_hImpl); + if (m_hImpl) + (void) store_releaseHandle (m_hImpl); + m_hImpl = rhs.m_hImpl; + return *this; + } + + /** Open the stream. + @see store_openStream() + */ + storeError create ( + storeFileHandle hFile, + OUString const & rPath, + OUString const & rName, + storeAccessMode eMode) + { + if (m_hImpl) + { + (void) store_releaseHandle (m_hImpl); + m_hImpl = nullptr; + } + return store_openStream (hFile, rPath.pData, rName.pData, eMode, &m_hImpl); + } + + /** Read from the stream. + @see store_readStream() + */ + storeError readAt ( + sal_uInt32 nOffset, + void * pBuffer, + sal_uInt32 nBytes, + sal_uInt32 & rnDone) + { + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_readStream (m_hImpl, nOffset, pBuffer, nBytes, &rnDone); + } + + /** Write to the stream. + @see store_writeStream() + */ + storeError writeAt ( + sal_uInt32 nOffset, + void const * pBuffer, + sal_uInt32 nBytes, + sal_uInt32 & rnDone) + { + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_writeStream (m_hImpl, nOffset, pBuffer, nBytes, &rnDone); + } + +private: + /** Representation. + */ + storeStreamHandle m_hImpl; +}; + +class OStoreDirectory +{ +public: + /** Construction. + */ + OStoreDirectory() + : m_hImpl (nullptr) + {} + + /** Destruction. + */ + ~OStoreDirectory() + { + if (m_hImpl) + (void) store_releaseHandle (m_hImpl); + } + + /** Copy construction. + */ + OStoreDirectory (OStoreDirectory const & rhs) + : m_hImpl (rhs.m_hImpl) + { + if (m_hImpl) + (void) store_acquireHandle (m_hImpl); + } + + /** Move construction. + */ + OStoreDirectory (OStoreDirectory && rhs) noexcept + : m_hImpl (rhs.m_hImpl) + { + rhs.m_hImpl = nullptr; + } + + /** Assignment. + */ + OStoreDirectory & operator= (OStoreDirectory const & rhs) + { + if (rhs.m_hImpl) + (void) store_acquireHandle (rhs.m_hImpl); + if (m_hImpl) + (void) store_releaseHandle (m_hImpl); + m_hImpl = rhs.m_hImpl; + return *this; + } + + /** Move assignment. + */ + OStoreDirectory & operator= (OStoreDirectory && rhs) noexcept + { + if (m_hImpl) + (void) store_releaseHandle (m_hImpl); + m_hImpl = rhs.m_hImpl; + rhs.m_hImpl = nullptr; + return *this; + } + + /** Open the directory. + @see store_openDirectory() + */ + storeError create ( + storeFileHandle hFile, + OUString const & rPath, + OUString const & rName, + storeAccessMode eMode) + { + if (m_hImpl) + { + (void) store_releaseHandle (m_hImpl); + m_hImpl = nullptr; + } + return store_openDirectory (hFile, rPath.pData, rName.pData, eMode, &m_hImpl); + } + + /** Directory iterator type. + @see first() + @see next() + */ + typedef storeFindData iterator; + + /** Find first directory entry. + @see store_findFirst() + */ + storeError first (iterator& it) + { + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_findFirst (m_hImpl, &it); + } + + /** Find next directory entry. + @see store_findNext() + */ + storeError next (iterator& it) + { + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_findNext (m_hImpl, &it); + } + +private: + /** Representation. + */ + storeDirectoryHandle m_hImpl; +}; + +class OStoreFile +{ +public: + /** Construction. + */ + OStoreFile() + : m_hImpl (nullptr) + {} + + /** Destruction. + */ + ~OStoreFile() + { + if (m_hImpl) + (void) store_releaseHandle (m_hImpl); + } + + /** Copy construction. + */ + OStoreFile (OStoreFile const & rhs) + : m_hImpl (rhs.m_hImpl) + { + if (m_hImpl) + (void) store_acquireHandle (m_hImpl); + } + + /** Assignment. + */ + OStoreFile & operator= (OStoreFile const & rhs) + { + if (rhs.m_hImpl) + (void) store_acquireHandle (rhs.m_hImpl); + if (m_hImpl) + (void) store_releaseHandle (m_hImpl); + m_hImpl = rhs.m_hImpl; + return *this; + } + + /** Conversion into File Handle. + */ + operator storeFileHandle() const + { + return m_hImpl; + } + + /** Check for a valid File Handle. + @return sal_True if valid, sal_False otherwise. + */ + bool isValid() const + { + return (m_hImpl != nullptr); + } + + /** Open the file. + @see store_openFile() + */ + storeError create( + OUString const & rFilename, + storeAccessMode eAccessMode ) + { + if (m_hImpl) + { + (void) store_releaseHandle (m_hImpl); + m_hImpl = nullptr; + } + return store_openFile (rFilename.pData, eAccessMode, STORE_DEFAULT_PAGESIZE, &m_hImpl); + } + + /** Open the temporary file in memory. + @see store_createMemoryFile() + */ + storeError createInMemory () + { + if (m_hImpl) + { + (void) store_releaseHandle (m_hImpl); + m_hImpl = nullptr; + } + return store_createMemoryFile (STORE_DEFAULT_PAGESIZE, &m_hImpl); + } + + /** Close the file. + @see store_closeFile() + */ + void close() + { + if (m_hImpl) + { + (void) store_closeFile (m_hImpl); + m_hImpl = nullptr; + } + } + + /** Flush the file. + @see store_flushFile() + */ + storeError flush() const + { + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_flushFile (m_hImpl); + } + + /** Remove a file entry. + @see store_remove() + */ + storeError remove ( + OUString const & rPath, OUString const & rName) + { + if (!m_hImpl) + return store_E_InvalidHandle; + + return store_remove (m_hImpl, rPath.pData, rName.pData); + } + +private: + /** Representation. + */ + storeFileHandle m_hImpl; +}; + +} // namespace store + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/store/storedllapi.h b/include/store/storedllapi.h new file mode 100644 index 000000000..14a0d2feb --- /dev/null +++ b/include/store/storedllapi.h @@ -0,0 +1,29 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include <sal/types.h> + +#if defined(STORE_DLLIMPLEMENTATION) +#define STORE_DLLPUBLIC SAL_DLLPUBLIC_EXPORT +#else +#define STORE_DLLPUBLIC SAL_DLLPUBLIC_IMPORT +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/store/types.h b/include/store/types.h new file mode 100644 index 000000000..7abf012ea --- /dev/null +++ b/include/store/types.h @@ -0,0 +1,130 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <sal/types.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** PageSize (recommended) default. + @see store_openFile() + */ +constexpr sal_uInt16 STORE_DEFAULT_PAGESIZE = 0x0400; + + +/** PageSize (enforced) limits. + @see store_openFile() + */ +constexpr sal_uInt16 STORE_MINIMUM_PAGESIZE = 0x0200; +constexpr sal_uInt16 STORE_MAXIMUM_PAGESIZE = 0x8000; + + +/** NameSize (enforced) limit. + @see any param pName + @see store_E_NameTooLong + */ +constexpr auto STORE_MAXIMUM_NAMESIZE = 256; + + +/** Attributes (predefined). + @see store_attrib() + */ +constexpr sal_uInt32 STORE_ATTRIB_ISLINK = 0x10000000; +constexpr sal_uInt32 STORE_ATTRIB_ISDIR = 0x20000000; +constexpr sal_uInt32 STORE_ATTRIB_ISFILE = 0x40000000; + + +/** Access Mode enumeration. + @see store_openFile() + @see store_openDirectory() + @see store_openStream() + */ +enum class storeAccessMode +{ + Create, + ReadWrite, + ReadOnly, + FORCE_EQUAL_SIZE = SAL_MAX_ENUM +}; + + +/** Error Code enumeration. + */ +typedef enum +{ + store_E_None = 0, + store_E_AccessViolation, + store_E_LockingViolation, + store_E_CantSeek, + store_E_CantRead, + store_E_CantWrite, + store_E_InvalidAccess, + store_E_InvalidHandle, + store_E_InvalidParameter, + store_E_InvalidChecksum, + store_E_AlreadyExists, + store_E_NotExists, + store_E_NotDirectory, + store_E_NotFile, + store_E_NoMoreFiles, + store_E_NameTooLong, + store_E_OutOfMemory, + store_E_OutOfSpace, + store_E_Pending, + store_E_WrongFormat, + store_E_WrongVersion, + store_E_Unknown, + store_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM +} storeError; + + +/** Find Data structure. + @see store_findFirst() + @see store_findNext() + */ +typedef struct +{ + /** Name. + @see m_nLength + */ + sal_Unicode m_pszName[STORE_MAXIMUM_NAMESIZE]; + + /** Name Length. + @see m_pszName + */ + sal_Int32 m_nLength; + + /** Attributes. + @see store_attrib() + */ + sal_uInt32 m_nAttrib; + + /** Reserved for internal use. + */ + sal_uInt32 m_nReserved; +} storeFindData; + +#ifdef __cplusplus +} +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |