STLSoft - ... Robust, Lightweight, Cross-platform, Template Software ... ATLSTL - Template Software for the Active Template Library COMSTL - The Standard Template Library meets the Component Object Model .netSTL - Standard Template Library meets the Microsoft.NET Common Language Runtime InetSTL - The Standard Template Library meets WinInet MFCSTL - Template Software for the Microsoft Foundation Classes UNIXSTL - Template Software for the UNIX Operating System WinSTL - where the Standard Template Library meets the Win32 API

Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

comstl_initialisers.h

Go to the documentation of this file.
00001 /* 
00002  * File:        comstl_initialisers.h (originally MOInit.h, ::SynesisCom)
00003  *
00004  * Purpose:     Contains classes for initialising COM/OLE.
00005  *
00006  * Created:     8th February 1999
00007  * Updated:     11th September 2004
00008  *
00009  * Home:        http://stlsoft.org/
00010  *
00011  * Copyright (c) 1999-2004, 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 name(s) 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 
00044 
00045 #ifndef COMSTL_INCL_H_COMSTL_INITIALISERS
00046 #define COMSTL_INCL_H_COMSTL_INITIALISERS
00047 
00048 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00049 # define COMSTL_VER_H_COMSTL_INITIALISERS_MAJOR     2
00050 # define COMSTL_VER_H_COMSTL_INITIALISERS_MINOR     0
00051 # define COMSTL_VER_H_COMSTL_INITIALISERS_REVISION  1
00052 # define COMSTL_VER_H_COMSTL_INITIALISERS_EDIT      44
00053 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00054 
00055 /* 
00056  * Includes
00057  */
00058 
00059 #ifndef COMSTL_INCL_H_COMSTL
00060 # include "comstl.h"                // Include the COMSTL root header
00061 #endif /* !COMSTL_INCL_H_COMSTL */
00062 
00063 /* 
00064  * Namespace
00065  *
00066  * The COMSTL components are contained within the comstl namespace. This is
00067  * actually an alias for stlsoft::comstl_project,
00068  *
00069  * The definition matrix is as follows:
00070  *
00071  * _STLSOFT_NO_NAMESPACE    _COMSTL_NO_NAMESPACE    comstl definition
00072  * ---------------------    --------------------    -----------------
00073  *  not defined              not defined             = stlsoft::comstl_project
00074  *  not defined              defined                 not defined
00075  *  defined                  not defined             comstl
00076  *  defined                  defined                 not defined
00077  *
00078  */
00079 
00080 #ifndef _COMSTL_NO_NAMESPACE
00081 # if defined(_STLSOFT_NO_NAMESPACE) || \
00082      defined(__STLSOFT_DOCUMENTATION_SKIP_SECTION)
00083 /* There is no stlsoft namespace, so must define ::comstl */
00084 namespace comstl
00085 {
00086 # else
00087 /* Define stlsoft::comstl_project */
00088 
00089 namespace stlsoft
00090 {
00091 
00092 namespace comstl_project
00093 {
00094 
00095 # endif /* _STLSOFT_NO_NAMESPACE */
00096 #endif /* !_COMSTL_NO_NAMESPACE */
00097 
00098 /* 
00099  * Classes
00100  */
00101 
00106 template<   ss_typename_param_k IP  /* Initialisation policy type */
00107         ,   ss_typename_param_k XP  /* Exception policy type */
00108         >
00109 class initialiser
00110 {
00111 private:
00112     typedef initialiser   class_type;
00113 public:
00115     typedef IP                                                      initialisation_policy_type;
00117     typedef XP                                                      exception_policy_type;
00119     typedef ss_typename_type_k exception_policy_type::thrown_type   thrown_type;
00120 
00121 // Construction
00122 public:
00124     initialiser();
00125 #ifdef __COMSTL_CF_DCOM_SUPPORT
00126 
00127     ss_explicit_k initialiser(cs_dword_t dwInit /* = COINIT_APARTMENTTHREADED */);
00128 #endif /* __COMSTL_CF_DCOM_SUPPORT */
00129 
00130     ~initialiser() comstl_throw_0();
00131 
00132 // Attributes
00133 public:
00135     cs_bool_t is_initialised() const;
00137     cs_bool_t operator !() const;
00139     HRESULT get_HRESULT() const;
00140 
00141 // Members
00142 private:
00143     HRESULT const   m_hr;
00144 
00145 // Not to be implemented
00146 private:
00147     initialiser(class_type const &rhs);
00148     class_type const &operator =(class_type const &rhs);
00149 };
00150 
00152 // Value policies
00153 
00154 #ifndef __STLSOFT_DOCUMENTATION_SKIP_SECTION
00155 
00156 struct CoInitialize_policy
00157 {
00158 public:
00159     static HRESULT init()
00160     {
00161         return ::CoInitialize(NULL);
00162     }
00163 #ifdef __COMSTL_CF_DCOM_SUPPORT
00164     static HRESULT init(cs_dword_t coInit)
00165     {
00166         return ::CoInitializeEx(NULL, coInit);
00167     }
00168 #endif /* __COMSTL_CF_DCOM_SUPPORT */
00169     static void uninit()
00170     {
00171         ::CoUninitialize();
00172     }
00173 };
00174 
00175 struct OleInitialize_policy
00176 {
00177 public:
00178     static HRESULT init()
00179     {
00180         return ::OleInitialize(NULL);
00181     }
00182     static void uninit()
00183     {
00184         ::OleUninitialize();
00185     }
00186 };
00187 
00188 #endif /* !__STLSOFT_DOCUMENTATION_SKIP_SECTION */
00189 
00191 // Exception policies
00192 
00194 struct ignore_initialisation_exception
00195 {
00196 public:
00198     struct thrown_type
00199     {
00200     };
00201 
00202 public:
00207     void operator ()(HRESULT hr, REFIID riid) comstl_throw_0()
00208     {
00209         STLSOFT_SUPPRESS_UNUSED(hr);
00210         STLSOFT_SUPPRESS_UNUSED(riid);
00211 
00212         // Do nothing
00213     }
00214 };
00215 
00216 
00218 // Typedefs for US-English spellers
00219 
00220 typedef initialiser<CoInitialize_policy, ignore_initialisation_exception>   com_initialiser;
00221 typedef initialiser<OleInitialize_policy, ignore_initialisation_exception>  ole_initialiser;
00222 
00223 typedef com_initialiser com_initializer;
00224 typedef ole_initialiser ole_initializer;
00225 
00227 // Unit-testing
00228 
00229 #ifdef STLSOFT_UNITTEST
00230 
00231 namespace unittest
00232 {
00233     ss_bool_t test_comstl_initialisers(unittest_reporter *r)
00234     {
00235         using stlsoft::unittest::unittest_initialiser;
00236 
00237         ss_bool_t               bSuccess    =   true;
00238 
00239         unittest_initialiser    init(r, "COMSTL", "initialisers", __FILE__);
00240 
00241         com_initializer coinit;
00242 
00243 #if 0
00244         if(<<TODO>>)
00245         {
00246             r->report("<<TODO>> failed ", __LINE__);
00247             bSuccess = false;
00248         }
00249 #endif /* 0 */
00250 
00251         return bSuccess;
00252     }
00253 
00254     unittest_registrar    unittest_comstl_initialisers(test_comstl_initialisers);
00255 
00256 } // namespace unittest
00257 
00258 #endif /* STLSOFT_UNITTEST */
00259 
00261 // Implementation
00262 
00263 // initialiser
00264 
00265 template<   ss_typename_param_k IP
00266         ,   ss_typename_param_k XP
00267         >
00268 inline initialiser<IP, XP>::initialiser()
00269     : m_hr(initialisation_policy_type::init())
00270 {}
00271 
00272 #ifdef __COMSTL_CF_DCOM_SUPPORT
00273 template<   ss_typename_param_k IP
00274         ,   ss_typename_param_k XP
00275         >
00276 inline initialiser<IP, XP>::initialiser(cs_dword_t coInit)
00277     : m_hr(initialisation_policy_type::init(coInit))
00278 {}
00279 #endif // __COMSTL_CF_DCOM_SUPPORT
00280 
00281 template<   ss_typename_param_k IP
00282         ,   ss_typename_param_k XP
00283         >
00284 inline initialiser<IP, XP>::~initialiser() comstl_throw_0()
00285 {
00286     if(is_initialised())
00287     {
00288         initialisation_policy_type::uninit();
00289     }
00290 }
00291 
00292 template<   ss_typename_param_k IP
00293         ,   ss_typename_param_k XP
00294         >
00295 inline cs_bool_t initialiser<IP, XP>::is_initialised() const
00296 {
00297     return SUCCEEDED(m_hr);
00298 }
00299 
00300 template<   ss_typename_param_k IP
00301         ,   ss_typename_param_k XP
00302         >
00303 inline cs_bool_t initialiser<IP, XP>::operator !() const
00304 {
00305     return !is_initialised();
00306 }
00307 
00308 template<   ss_typename_param_k IP
00309         ,   ss_typename_param_k XP
00310         >
00311 inline HRESULT initialiser<IP, XP>::get_HRESULT() const
00312 {
00313     return m_hr;
00314 }
00315 
00316 /* 
00317 
00318 #ifndef _COMSTL_NO_NAMESPACE
00319 # if defined(_STLSOFT_NO_NAMESPACE) || \
00320      defined(__STLSOFT_DOCUMENTATION_SKIP_SECTION)
00321 } // namespace comstl
00322 # else
00323 } // namespace stlsoft::comstl_project
00324 } // namespace stlsoft
00325 # endif /* _STLSOFT_NO_NAMESPACE */
00326 #endif /* !_COMSTL_NO_NAMESPACE */
00327 
00328 /* 
00329 
00330 #endif /* !COMSTL_INCL_H_COMSTL_INITIALISERS */
00331 
00332 /* 

STLSoft Libraries documentation © Synesis Software Pty Ltd, 2001-2004