diff options
Diffstat (limited to 'include/cosv/openclose.hxx')
-rw-r--r-- | include/cosv/openclose.hxx | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/include/cosv/openclose.hxx b/include/cosv/openclose.hxx new file mode 100644 index 000000000000..c65ce5b753e2 --- /dev/null +++ b/include/cosv/openclose.hxx @@ -0,0 +1,137 @@ +/* -*- 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 . + */ + +#ifndef CSV_OPENCLOSE_HXX +#define CSV_OPENCLOSE_HXX + + +namespace csv +{ + +// Open modes for storages: +enum E_RWMode +{ + rwDefault = 0x0000, // Keep old settings. If there are none, set default. + rwRead = 0x0001, // Reads only + rwWrite = 0x0002, // Writes only + rwReadWrite = 0x0003 // Reads and writes. +}; + +enum E_OpenMode +{ + omCreateIfNecessary = 0x0000, // Creates a new file only, if file does not exist. + omCreateNot = 0x0010, // Open fails, if file does not exist. + omCreate = 0x0020 // Existing file will be deleted. +}; +enum E_ShareMode +{ + shmShareNot = 0x0000, // Allow others nothing + shmShareRead = 0x0004, // Allow others to read + shmShareAll = 0x000C // Allow others to read and write +}; + +/** Constants for filemode combinations + These combinations are the only ones, guaranteed to be supported. +*/ +const UINT32 CFM_RW = rwReadWrite; +const UINT32 CFM_CREATE = + static_cast< UINT32 >(rwReadWrite) | static_cast< UINT32 >(omCreate); +const UINT32 CFM_READ = + static_cast< UINT32 >(rwRead) | static_cast< UINT32 >(omCreateNot) | + static_cast< UINT32 >(shmShareRead); + + + +class OpenClose +{ + public: + virtual ~OpenClose() {} + + bool open( + UINT32 in_nOpenModeInfo = 0 ); /// Combination of values of E_RWMode and E_ShareMode und E_OpenMode. 0 := Keep existing mode. + void close(); + + bool is_open() const; + + private: + virtual bool do_open( + UINT32 in_nOpenModeInfo ) = 0; + virtual void do_close() = 0; + virtual bool inq_is_open() const = 0; +}; + + + +class OpenCloseGuard +{ + public: + OpenCloseGuard( + OpenClose & i_rOpenClose, + UINT32 i_nOpenModeInfo = 0 ); + ~OpenCloseGuard(); + operator bool() const; + + private: + // Forbidden: + OpenCloseGuard(OpenCloseGuard&); + OpenCloseGuard & operator=(OpenCloseGuard&); + + // DATA + OpenClose & rOpenClose; +}; + + +// IMPLEMENTATION + +inline bool +OpenClose::open( UINT32 i_nOpenModeInfo ) + { return do_open(i_nOpenModeInfo); } +inline void +OpenClose::close() + { do_close(); } +inline bool +OpenClose::is_open() const + { return inq_is_open(); } + +inline +OpenCloseGuard::OpenCloseGuard( OpenClose & i_rOpenClose, + UINT32 i_nOpenModeInfo ) + : rOpenClose(i_rOpenClose) + { rOpenClose.open(i_nOpenModeInfo); } +inline +OpenCloseGuard::~OpenCloseGuard() + { if (rOpenClose.is_open()) rOpenClose.close(); } +inline +OpenCloseGuard::operator bool() const + { return rOpenClose.is_open(); } + + + + +} // namespace csv + + + + + + +#endif + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |