blob: 5cdd3ca2cbcdfa126ec8fc43b9f596151ca306d4 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#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