Open-RJ C/C++ User's Journal Synesis Software STLSoft - ... Robust, Lightweight, Cross-platform, Template Software ...

openrj/cpp/filedatabase.hpp

Go to the documentation of this file.
00001 /* /////////////////////////////////////////////////////////////////////////////
00002  * File:    openrj/cpp/filedatabase.hpp
00003  *
00004  * Purpose: FileDatabase class, in the C++ mapping of the Open-RJ library
00005  *
00006  * Created: 12th April 2005
00007  * Updated: 28th May 2006
00008  *
00009  * Home:    http://openrj.org/
00010  *
00011  * Copyright (c) 2005, Matthew Wilson and Synesis Software
00012  * All rights reserved.
00013  *
00014  * Redistribution and use in source and binary forms, with or without
00015  * modification, are permitted provided that the following conditions are met:
00016  *
00017  * - Redistributions of source code must retain the above copyright notice, this
00018  *   list of conditions and the following disclaimer.
00019  * - Redistributions in binary form must reproduce the above copyright notice,
00020  *   this list of conditions and the following disclaimer in the documentation
00021  *   and/or other materials provided with the distribution.
00022  * - Neither the names of Matthew Wilson and Synesis Software nor the names of
00023  *   any contributors may be used to endorse or promote products derived from
00024  *   this software without specific prior written permission.
00025  *
00026  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00027  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00029  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00030  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00031  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00032  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00033  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00034  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00035  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00036  * POSSIBILITY OF SUCH DAMAGE.
00037  *
00038  * ////////////////////////////////////////////////////////////////////////// */
00039 
00040 
00046 #ifndef OPENRJ_INCL_OPENRJ_CPP_HPP_FILEDATABASE
00047 #define OPENRJ_INCL_OPENRJ_CPP_HPP_FILEDATABASE
00048 
00049 /* /////////////////////////////////////////////////////////////////////////////
00050  * Version information
00051  */
00052 
00053 #ifndef OPENRJ_DOCUMENTATION_SKIP_SECTION
00054 # define OPENRJ_VER_OPENRJ_CPP_HPP_FILEDATABASE_MAJOR       1
00055 # define OPENRJ_VER_OPENRJ_CPP_HPP_FILEDATABASE_MINOR       0
00056 # define OPENRJ_VER_OPENRJ_CPP_HPP_FILEDATABASE_REVISION    1
00057 # define OPENRJ_VER_OPENRJ_CPP_HPP_FILEDATABASE_EDIT        3
00058 #endif /* !OPENRJ_DOCUMENTATION_SKIP_SECTION */
00059 
00060 /* /////////////////////////////////////////////////////////////////////////////
00061  * Includes
00062  */
00063 
00064 #include <openrj/cpp/databasebase.hpp>
00065 #include <string.h>
00066 
00067 /* /////////////////////////////////////////////////////////////////////////////
00068  * Namespace
00069  */
00070 
00071 namespace openrj
00072 {
00073 namespace cpp
00074 {
00075 
00076 /* /////////////////////////////////////////////////////////////////////////////
00077  * Classes
00078  */
00079 
00080 #ifndef OPENRJ_NO_FILE_HANDLING
00082 class FileDatabase
00083     : public DatabaseBase
00084 {
00087 protected:
00088     typedef DatabaseBase    parent_class_type;
00089 public:
00090     typedef FileDatabase    class_type;
00092 
00095 public:
00101     explicit FileDatabase(char const *jarName, unsigned flags = 0) // throw (DatabaseException)
00102         : parent_class_type(create_database_(jarName, flags))
00103         , m_name(alloc_name_(jarName))
00104     {}
00106     virtual ~FileDatabase()
00107     {
00108         Close();
00109 
00110         free(m_name);
00111     }
00112 
00114     virtual void Close()
00115     {
00116         this->parent_class_type::Close();
00117     }
00119 
00122 public:
00124     char const *GetPath() const
00125     {
00126         return m_name;
00127     }
00129 
00132 private:
00133     static char *alloc_name_(char const *s)
00134     {
00135         char    *new_s  =   ::strdup(s);
00136 
00137 #if !defined(ORJ_NO_EXCEPTIONS)
00138         if(NULL == new_s)
00139         {
00140             throw std::bad_alloc();
00141         }
00142 #endif /* !ORJ_NO_EXCEPTIONS */
00143 
00144         return new_s;
00145     }
00146 
00147     static ORJDatabase const *create_database_(char const *jarName, unsigned flags = 0) // throw (DatabaseException)
00148     {
00149         ORJDatabase const   *database;
00150         ORJError            error;
00151         ORJRC               rc = ORJ_ReadDatabase(jarName, NULL, flags, &database, &error);
00152 
00153         if(ORJ_RC_SUCCESS != rc)
00154         {
00155 #if !defined(ORJ_NO_EXCEPTIONS)
00156             // throw something here
00157             throw DatabaseException(rc, error);
00158 #endif /* !ORJ_NO_EXCEPTIONS */
00159         }
00160 
00161         return database;
00162     }
00163 
00165 
00168 private:
00169     char    *const  m_name;
00171 
00172 // Not to be implemented
00173 private:
00174     FileDatabase(class_type const &);
00175     class_type &operator =(class_type const &);
00176 };
00177 
00178 typedef FileDatabase    Database;
00179 #endif /* !OPENRJ_NO_FILE_HANDLING */
00180 
00181 /* /////////////////////////////////////////////////////////////////////////////
00182  * Namespace
00183  */
00184 
00185 } // namespace cpp
00186 } // namespace openrj
00187 
00188 /* ////////////////////////////////////////////////////////////////////////// */
00189 
00190 #endif /* !OPENRJ_INCL_OPENRJ_CPP_HPP_FILEDATABASE */
00191 
00192 /* ////////////////////////////////////////////////////////////////////////// */

Open-RJ Library documentation © Synesis Software Pty Ltd, 2004-2005