LCOV - code coverage report
Current view: top level - solver/unxlngi6.pro/inc/registry - registry.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 186 270 68.9 %
Date: 2012-08-25 Functions: 42 70 60.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 65 182 35.7 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*
       3                 :            :  * This file is part of the LibreOffice project.
       4                 :            :  *
       5                 :            :  * This Source Code Form is subject to the terms of the Mozilla Public
       6                 :            :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7                 :            :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8                 :            :  *
       9                 :            :  * This file incorporates work covered by the following license notice:
      10                 :            :  *
      11                 :            :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12                 :            :  *   contributor license agreements. See the NOTICE file distributed
      13                 :            :  *   with this work for additional information regarding copyright
      14                 :            :  *   ownership. The ASF licenses this file to you under the Apache
      15                 :            :  *   License, Version 2.0 (the "License"); you may not use this file
      16                 :            :  *   except in compliance with the License. You may obtain a copy of
      17                 :            :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18                 :            :  */
      19                 :            : 
      20                 :            : #ifndef _REGISTRY_REGISTRY_HXX_
      21                 :            : #define _REGISTRY_REGISTRY_HXX_
      22                 :            : 
      23                 :            : #include <registry/regdllapi.h>
      24                 :            : #include <registry/regtype.h>
      25                 :            : #include <rtl/ustring.hxx>
      26                 :            : 
      27                 :            : #ifdef __cplusplus
      28                 :            : extern "C" {
      29                 :            : #endif
      30                 :            : 
      31                 :            : /** specifies a collection of function pointers which represents the complete registry C-API.
      32                 :            : 
      33                 :            :     This funtions pointers are used by the C++ wrapper to call the C-API.
      34                 :            : */
      35                 :            : struct Registry_Api
      36                 :            : {
      37                 :            :     void        (REGISTRY_CALLTYPE *acquire)            (RegHandle);
      38                 :            :     void        (REGISTRY_CALLTYPE *release)            (RegHandle);
      39                 :            :     sal_Bool    (REGISTRY_CALLTYPE *isReadOnly)         (RegHandle);
      40                 :            :     RegError    (REGISTRY_CALLTYPE *openRootKey)        (RegHandle, RegKeyHandle*);
      41                 :            :     RegError    (REGISTRY_CALLTYPE *getName)            (RegHandle, rtl_uString**);
      42                 :            :     RegError    (REGISTRY_CALLTYPE *createRegistry)     (rtl_uString*, RegHandle*);
      43                 :            :     RegError    (REGISTRY_CALLTYPE *openRegistry)       (rtl_uString*, RegHandle*, RegAccessMode);
      44                 :            :     RegError    (REGISTRY_CALLTYPE *closeRegistry)      (RegHandle);
      45                 :            :     RegError    (REGISTRY_CALLTYPE *destroyRegistry)    (RegHandle, rtl_uString*);
      46                 :            :     RegError    (REGISTRY_CALLTYPE *loadKey)            (RegHandle, RegKeyHandle, rtl_uString*, rtl_uString*);
      47                 :            :     RegError    (REGISTRY_CALLTYPE *saveKey)            (RegHandle, RegKeyHandle, rtl_uString*, rtl_uString*);
      48                 :            :     RegError    (REGISTRY_CALLTYPE *mergeKey)           (RegHandle, RegKeyHandle, rtl_uString*, rtl_uString*, sal_Bool, sal_Bool);
      49                 :            :     RegError    (REGISTRY_CALLTYPE *dumpRegistry)       (RegHandle, RegKeyHandle);
      50                 :            :     void        (REGISTRY_CALLTYPE *acquireKey)         (RegKeyHandle);
      51                 :            :     void        (REGISTRY_CALLTYPE *releaseKey)         (RegKeyHandle);
      52                 :            :     sal_Bool    (REGISTRY_CALLTYPE *isKeyReadOnly)      (RegKeyHandle);
      53                 :            :     RegError    (REGISTRY_CALLTYPE *getKeyName)         (RegKeyHandle, rtl_uString**);
      54                 :            :     RegError    (REGISTRY_CALLTYPE *createKey)          (RegKeyHandle, rtl_uString*, RegKeyHandle*);
      55                 :            :     RegError    (REGISTRY_CALLTYPE *openKey)            (RegKeyHandle, rtl_uString*, RegKeyHandle*);
      56                 :            :     RegError    (REGISTRY_CALLTYPE *openSubKeys)        (RegKeyHandle, rtl_uString*, RegKeyHandle**, sal_uInt32*);
      57                 :            :     RegError    (REGISTRY_CALLTYPE *closeSubKeys)       (RegKeyHandle*, sal_uInt32);
      58                 :            :     RegError    (REGISTRY_CALLTYPE *deleteKey)          (RegKeyHandle, rtl_uString*);
      59                 :            :     RegError    (REGISTRY_CALLTYPE *closeKey)           (RegKeyHandle);
      60                 :            :     RegError    (REGISTRY_CALLTYPE *setValue)           (RegKeyHandle, rtl_uString*, RegValueType, RegValue, sal_uInt32);
      61                 :            :     RegError    (REGISTRY_CALLTYPE *setLongListValue)   (RegKeyHandle, rtl_uString*, sal_Int32*, sal_uInt32);
      62                 :            :     RegError    (REGISTRY_CALLTYPE *setStringListValue) (RegKeyHandle, rtl_uString*, sal_Char**, sal_uInt32);
      63                 :            :     RegError    (REGISTRY_CALLTYPE *setUnicodeListValue)(RegKeyHandle, rtl_uString*, sal_Unicode**, sal_uInt32);
      64                 :            :     RegError    (REGISTRY_CALLTYPE *getValueInfo)       (RegKeyHandle, rtl_uString*, RegValueType*, sal_uInt32*);
      65                 :            :     RegError    (REGISTRY_CALLTYPE *getValue)           (RegKeyHandle, rtl_uString*, RegValue);
      66                 :            :     RegError    (REGISTRY_CALLTYPE *getLongListValue)   (RegKeyHandle, rtl_uString*, sal_Int32**, sal_uInt32*);
      67                 :            :     RegError    (REGISTRY_CALLTYPE *getStringListValue) (RegKeyHandle, rtl_uString*, sal_Char***, sal_uInt32*);
      68                 :            :     RegError    (REGISTRY_CALLTYPE *getUnicodeListValue)(RegKeyHandle, rtl_uString*, sal_Unicode***, sal_uInt32*);
      69                 :            :     RegError    (REGISTRY_CALLTYPE *freeValueList)      (RegValueType, RegValue, sal_uInt32);
      70                 :            :     RegError    (REGISTRY_CALLTYPE *createLink)         (RegKeyHandle, rtl_uString*, rtl_uString*);
      71                 :            :     RegError    (REGISTRY_CALLTYPE *deleteLink)         (RegKeyHandle, rtl_uString*);
      72                 :            :     RegError    (REGISTRY_CALLTYPE *getKeyType)         (RegKeyHandle, rtl_uString*, RegKeyType*);
      73                 :            :     RegError    (REGISTRY_CALLTYPE *getLinkTarget)      (RegKeyHandle, rtl_uString*, rtl_uString**);
      74                 :            :     RegError    (REGISTRY_CALLTYPE *getResolvedKeyName) (RegKeyHandle, rtl_uString*, sal_Bool, rtl_uString**);
      75                 :            :     RegError    (REGISTRY_CALLTYPE *getKeyNames)        (RegKeyHandle, rtl_uString*, rtl_uString***, sal_uInt32*);
      76                 :            :     RegError    (REGISTRY_CALLTYPE *freeKeyNames)       (rtl_uString**, sal_uInt32);
      77                 :            : };
      78                 :            : 
      79                 :            : /** the API initialization function.
      80                 :            : */
      81                 :            : REG_DLLPUBLIC Registry_Api* REGISTRY_CALLTYPE initRegistry_Api(void);
      82                 :            : 
      83                 :            : #ifdef __cplusplus
      84                 :            : }
      85                 :            : #endif
      86                 :            : 
      87                 :            : 
      88                 :            : class RegistryKey;
      89                 :            : 
      90                 :            : //-----------------------------------------------------------------------------
      91                 :            : 
      92                 :            : /** The Registry provides the functionality to read and write information in a registry file.
      93                 :            : 
      94                 :            :     The class is implemented inline and use a C-Api.
      95                 :            : */
      96                 :            : class Registry
      97                 :            : {
      98                 :            : public:
      99                 :            :     /** Default constructor.
     100                 :            :      */
     101                 :            :     inline Registry();
     102                 :            : 
     103                 :            :     /// Copy constructcor
     104                 :            :     inline Registry(const Registry& toCopy);
     105                 :            : 
     106                 :            :     /// Destructor. The Destructor close the registry if it is open.
     107                 :            :     inline ~Registry();
     108                 :            : 
     109                 :            :     /// Assign operator
     110                 :            :     inline Registry& operator = (const Registry& toAssign);
     111                 :            : 
     112                 :            :     /// checks if the registry points to a valid registry data file.
     113                 :            :     inline sal_Bool isValid() const;
     114                 :            : 
     115                 :            :     /** returns the access mode of the registry.
     116                 :            : 
     117                 :            :         @return TRUE if the access mode is readonly else FALSE.
     118                 :            :     */
     119                 :            :     inline sal_Bool     isReadOnly() const;
     120                 :            : 
     121                 :            :     /** opens the root key of the registry.
     122                 :            : 
     123                 :            :         @param  rRootKey reference to a RegistryKey which is filled with the rootkey.
     124                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     125                 :            :     */
     126                 :            :     inline RegError openRootKey(RegistryKey& rRootKey);
     127                 :            : 
     128                 :            :     /// returns the name of the current registry data file.
     129                 :            :     inline ::rtl::OUString getName();
     130                 :            : 
     131                 :            :     /** creates a new registry with the specified name and creates a root key.
     132                 :            : 
     133                 :            :         @param  registryName specifies the name of the new registry.
     134                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     135                 :            :     */
     136                 :            :     inline RegError create(const ::rtl::OUString& registryName);
     137                 :            : 
     138                 :            :     /** opens a registry with the specified name.
     139                 :            : 
     140                 :            :         If the registry already points to a valid registry, the old registry will be closed.
     141                 :            :         @param  registryName specifies a registry name.
     142                 :            :         @param  accessMode specifies the access mode for the registry, REG_READONLY or REG_READWRITE.
     143                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     144                 :            :     */
     145                 :            :     inline RegError open(const ::rtl::OUString& registryName,
     146                 :            :                             RegAccessMode accessMode);
     147                 :            : 
     148                 :            :     /// closes explicitly the current registry data file.
     149                 :            :     inline RegError close();
     150                 :            : 
     151                 :            :     /** destroys a registry.
     152                 :            : 
     153                 :            :         @param registryName specifies a registry name, if the name is an empty string the registry
     154                 :            :                             itselfs will be destroyed.
     155                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     156                 :            :     */
     157                 :            :     inline RegError destroy(const ::rtl::OUString& registryName);
     158                 :            : 
     159                 :            :     /** loads registry information from a specified file and save it under the
     160                 :            :         specified keyName.
     161                 :            : 
     162                 :            :         @param  rKey references a currently open key. The key which should store the registry information
     163                 :            :                      is a subkey of this key.
     164                 :            :         @param  keyName specifies the name of the key which stores the registry information. If keyName is
     165                 :            :                         is an empty string the registry information will be saved under the key specified
     166                 :            :                         by rKey.
     167                 :            :         @param  regFileName specifies the file containing the registry information.
     168                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     169                 :            :     */
     170                 :            :     inline RegError loadKey(RegistryKey& rKey,
     171                 :            :                                const ::rtl::OUString& keyName,
     172                 :            :                                const ::rtl::OUString& regFileName);
     173                 :            : 
     174                 :            :     /** saves the registry information of the specified key and all subkeys and save
     175                 :            :         it in the specified file.
     176                 :            : 
     177                 :            :         @param  rKey references a currently open key. The key which information is saved by this
     178                 :            :                      function is a subkey of this key.
     179                 :            :         @param  keyName specifies the name of the key which information should be stored.
     180                 :            :                         If keyName is an empty string the registry information under the key specified
     181                 :            :                         by rKey is saved in the specified file.
     182                 :            :         @param  regFileName specifies the file containing the registry information.
     183                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     184                 :            :     */
     185                 :            :     inline RegError saveKey(RegistryKey& rKey,
     186                 :            :                                const ::rtl::OUString& keyName,
     187                 :            :                                const ::rtl::OUString& regFileName);
     188                 :            : 
     189                 :            :     /** merges the registry information of the specified key with the registry
     190                 :            :         information of the specified file.
     191                 :            : 
     192                 :            :         All existing keys will be extended and existing key values will be overwritten.
     193                 :            :         @param  rKey references a currently open key. The key which information is merged by this
     194                 :            :                      function is a subkey of this key
     195                 :            :         @param  keyName specifies the name of the key which will be merged.
     196                 :            :                         If keyName is an empty string the registry information under the key specified
     197                 :            :                         by rKey is merged with the information from the specified file.
     198                 :            :         @param  regFileName specifies the file containing the registry information.
     199                 :            :         @param  bWarnings if TRUE the function returns an error if a key already exists.
     200                 :            :         @param  bReport if TRUE the function reports warnings on stdout if a key already exists.
     201                 :            :         @return REG_NO_ERROR if succeeds else an error code. If it returns an error the registry will
     202                 :            :                 restore the state before merging.
     203                 :            :     */
     204                 :            :     inline RegError mergeKey(RegistryKey& rKey,
     205                 :            :                                 const ::rtl::OUString& keyName,
     206                 :            :                                 const ::rtl::OUString& regFileName,
     207                 :            :                              sal_Bool bWarnings = sal_False,
     208                 :            :                                 sal_Bool bReport = sal_False);
     209                 :            : 
     210                 :            :     /** This function reports the complete registry information of a key and all of its subkeys.
     211                 :            : 
     212                 :            :         All information which are available (keynames, value types, values, ...)
     213                 :            :         will be printed to stdout for report issues only.
     214                 :            :         @param  rKey references a currently open key which content will be reported.
     215                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     216                 :            :     */
     217                 :            :     inline RegError dumpRegistry(RegistryKey& rKey);
     218                 :            : 
     219                 :            :     friend class RegistryKey;
     220                 :            :     friend class RegistryKeyArray;
     221                 :            :     friend class RegistryKeyNames;
     222                 :            : 
     223                 :            :     /// returns the used registry Api.
     224                 :          0 :     const Registry_Api* getApi() { return m_pApi; }
     225                 :            : protected:
     226                 :            : 
     227                 :            :     /// stores the used and initialized registry Api.
     228                 :            :     const Registry_Api*                          m_pApi;
     229                 :            :     /// stores the handle of the underlying registry file on which most of the functions work.
     230                 :            :     RegHandle                                    m_hImpl;
     231                 :            : };
     232                 :            : 
     233                 :            : 
     234                 :            : //-----------------------------------------------------------------------------
     235                 :            : 
     236                 :            : /** RegistryKeyArray represents an array of open keys.
     237                 :            : 
     238                 :            :     RegistryKeyArray is a helper class to work with an array of keys.
     239                 :            : */
     240                 :            : class RegistryKeyArray
     241                 :            : {
     242                 :            : public:
     243                 :            :     /// Default constructor
     244                 :            :     inline RegistryKeyArray();
     245                 :            : 
     246                 :            :     /// Destructor, all subkeys will be closed.
     247                 :            :     inline ~RegistryKeyArray();
     248                 :            : 
     249                 :            :     /// returns the open key specified by index.
     250                 :            :     inline RegistryKey getElement(sal_uInt32 index);
     251                 :            : 
     252                 :            :     /// returns the length of the array.
     253                 :            :     inline sal_uInt32 getLength();
     254                 :            : 
     255                 :            :     friend class RegistryKey;
     256                 :            : protected:
     257                 :            :     /** sets the data of the key array.
     258                 :            : 
     259                 :            :         @param registry specifies the registry files where the keys are located.
     260                 :            :         @param phKeys points to an array of open keys.
     261                 :            :         @param length specifies the length of the array specified by phKeys.
     262                 :            :      */
     263                 :            :     inline void setKeyHandles(Registry& registry, RegKeyHandle* phKeys, sal_uInt32 length);
     264                 :            :     /// close all subkeys
     265                 :            :     inline RegError closeKeyHandles();
     266                 :            : 
     267                 :            :     /// stores the number of open subkeys, the number of elements.
     268                 :            :     sal_uInt32      m_length;
     269                 :            :     /// stores an array of open subkeys.
     270                 :            :     RegKeyHandle*   m_phKeys;
     271                 :            :     /// stores the handle to the registry file where the appropriate keys are located.
     272                 :            :     Registry        m_registry;
     273                 :            : };
     274                 :            : 
     275                 :            : 
     276                 :            : /** RegistryKeyNames represents an array of key names.
     277                 :            : 
     278                 :            :     RegistryKeyNames is a helper class to work with an array of key names.
     279                 :            : */
     280                 :            : class RegistryKeyNames
     281                 :            : {
     282                 :            : public:
     283                 :            :     /// Default constructor
     284                 :            :     inline RegistryKeyNames();
     285                 :            : 
     286                 :            :     /// Destructor, the internal array with key names will be deleted.
     287                 :            :     inline ~RegistryKeyNames();
     288                 :            : 
     289                 :            :     /// returns the name of the key sepecified by index.
     290                 :            :     inline ::rtl::OUString getElement(sal_uInt32 index);
     291                 :            : 
     292                 :            :     /// returns the length of the array.
     293                 :            :     inline sal_uInt32 getLength();
     294                 :            : 
     295                 :            :     friend class RegistryKey;
     296                 :            : protected:
     297                 :            :     /** sets the data of the array.
     298                 :            : 
     299                 :            :         @param registry specifies the registry files where the keys are located.
     300                 :            :         @param pKeyNames points to an array of key names.
     301                 :            :         @param length specifies the length of the array specified by pKeyNames.
     302                 :            :      */
     303                 :            :     inline void setKeyNames(Registry& registry, rtl_uString** pKeyNames, sal_uInt32 length);
     304                 :            :     /// delete the array of key names.
     305                 :            :     inline RegError freeKeyNames();
     306                 :            : 
     307                 :            :     /// stores the number of key names, the number of elements.
     308                 :            :     sal_uInt32      m_length;
     309                 :            :     /// stores an array of key names.
     310                 :            :     rtl_uString**   m_pKeyNames;
     311                 :            :     /// stores the handle to the registry file where the appropriate keys are located.
     312                 :            :     Registry        m_registry;
     313                 :            : };
     314                 :            : 
     315                 :            : //-----------------------------------------------------------------------------
     316                 :            : 
     317                 :            : /** RegistryValueList represents a value list of the specified type.
     318                 :            : 
     319                 :            :     RegistryValueList is a helper class to work with a list value.
     320                 :            : */
     321                 :            : template<class ValueType>
     322                 :            : class RegistryValueList
     323                 :            : {
     324                 :            : public:
     325                 :            :     /// Default constructor
     326                 :          0 :     RegistryValueList()
     327                 :            :         : m_length(0)
     328                 :            :         , m_pValueList(NULL)
     329                 :          0 :         , m_valueType(RG_VALUETYPE_NOT_DEFINED)
     330                 :          0 :         {}
     331                 :            : 
     332                 :            :     /// Destructor, the internal value list will be freed.
     333                 :          0 :     ~RegistryValueList()
     334                 :            :     {
     335 [ #  # ][ #  # ]:          0 :         if (m_pValueList)
                 [ #  # ]
     336                 :            :         {
     337 [ #  # ][ #  # ]:          0 :             m_registry.getApi()->freeValueList(m_valueType, m_pValueList, m_length);
                 [ #  # ]
     338                 :            :         }
     339                 :          0 :     }
     340                 :            : 
     341                 :            :     /// returns the value of the list specified by index.
     342                 :          0 :     ValueType getElement(sal_uInt32 index)
     343                 :            :     {
     344 [ #  # ][ #  # ]:          0 :         if (m_registry.isValid() && index < m_length)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     345                 :            :         {
     346                 :          0 :             return m_pValueList[index];
     347                 :            :         } else
     348                 :            :         {
     349                 :          0 :             return 0;
     350                 :            :         }
     351                 :            :     }
     352                 :            : 
     353                 :            :     /// returns the length of the list.
     354                 :          0 :     sal_uInt32 getLength()
     355                 :            :     {
     356                 :          0 :         return m_length;
     357                 :            :     }
     358                 :            : 
     359                 :            :     friend class RegistryKey;
     360                 :            : protected:
     361                 :            :     /** sets the data of the value list.
     362                 :            : 
     363                 :            :         @param registry specifies the registry files where the appropriate key is located.
     364                 :            :         @param valueType specifies the type of the list values.
     365                 :            :         @param pValueList points to a value list.
     366                 :            :         @param length specifies the length of the list.
     367                 :            :      */
     368                 :          0 :     void setValueList(Registry& registry, RegValueType valueType,
     369                 :            :                       ValueType* pValueList, sal_uInt32 length)
     370                 :            :     {
     371                 :          0 :         m_length = length;
     372                 :          0 :         m_pValueList = pValueList;
     373                 :          0 :         m_valueType = valueType;
     374                 :          0 :         m_registry = registry;
     375                 :          0 :     }
     376                 :            : 
     377                 :            :     /// stores the length of the list, the number of elements.
     378                 :            :     sal_uInt32      m_length;
     379                 :            :     /// stores the value list.
     380                 :            :     ValueType*      m_pValueList;
     381                 :            :     /// stores the type of the list elements
     382                 :            :     RegValueType    m_valueType;
     383                 :            :     /** stores the handle to the registry file where the appropriate key to this
     384                 :            :         value is located.
     385                 :            :     */
     386                 :            :     Registry        m_registry;
     387                 :            : };
     388                 :            : 
     389                 :            : //-----------------------------------------------------------------------------
     390                 :            : 
     391                 :            : /** RegistryKey reads or writes information of the underlying key in a registry.
     392                 :            : 
     393                 :            :     Class is inline and use a load on call C-Api.
     394                 :            : */
     395                 :            : class RegistryKey
     396                 :            : {
     397                 :            : public:
     398                 :            :     /// Default constructor
     399                 :            :     inline RegistryKey();
     400                 :            : 
     401                 :            :     /// Copy constructor
     402                 :            :     inline RegistryKey(const RegistryKey& toCopy);
     403                 :            : 
     404                 :            :     /// Destructor, close the key if it references an open one.
     405                 :            :     inline ~RegistryKey();
     406                 :            : 
     407                 :            :     /// Assign operator
     408                 :            :     inline RegistryKey& operator = (const RegistryKey& toAssign);
     409                 :            : 
     410                 :            :     /// checks if the key points to a valid registry key.
     411                 :            :     inline sal_Bool isValid() const;
     412                 :            : 
     413                 :            :     /** returns the access mode of the key.
     414                 :            : 
     415                 :            :         @return TRUE if access mode is read only else FALSE.
     416                 :            :     */
     417                 :            :     inline sal_Bool     isReadOnly() const;
     418                 :            : 
     419                 :            :     /// returns the full qualified name of the key beginning with the rootkey.
     420                 :            :     inline ::rtl::OUString getName();
     421                 :            : 
     422                 :            :     /** creates a new key or opens a key if the specified key already exists.
     423                 :            : 
     424                 :            :         The specified keyname is relativ to this key.
     425                 :            :         @param  keyName specifies the name of the key which will be opened or created.
     426                 :            :         @param  rNewKey references a RegistryKey which will be filled with the new or open key.
     427                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     428                 :            :     */
     429                 :            :     inline RegError createKey(const ::rtl::OUString& keyName,
     430                 :            :                               RegistryKey& rNewKey);
     431                 :            : 
     432                 :            :     /** opens the specified key.
     433                 :            : 
     434                 :            :         The specified keyname is relativ to this key.
     435                 :            :         @param  keyName specifies the name of the key which will be opened.
     436                 :            :         @param  rOpenKey references a RegistryKey which will be filled with the open key.
     437                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     438                 :            :     */
     439                 :            :     inline RegError openKey(const ::rtl::OUString& keyName,
     440                 :            :                               RegistryKey& rOpenKey);
     441                 :            : 
     442                 :            :     /** opens all subkeys of the specified key.
     443                 :            : 
     444                 :            :         The specified keyname is relativ to this key.
     445                 :            :         @param  keyName specifies the name of the key which subkeys will be opened.
     446                 :            :         @param  rSubKeys reference a RegistryKeyArray which will be filled with the open subkeys.
     447                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     448                 :            :     */
     449                 :            :     inline RegError openSubKeys(const ::rtl::OUString& keyName,
     450                 :            :                                     RegistryKeyArray& rSubKeys);
     451                 :            : 
     452                 :            :     /** returns an array with the names of all subkeys of the specified key.
     453                 :            : 
     454                 :            :         The specified keyname is relativ to this key.
     455                 :            :         @param  keyName specifies the name of the key which subkey names will be returned.
     456                 :            :         @param  rSubKeyNames reference a RegistryKeyNames array which will be filled with the subkey names.
     457                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     458                 :            :     */
     459                 :            :     inline RegError getKeyNames(const ::rtl::OUString& keyName,
     460                 :            :                                     RegistryKeyNames& rSubKeyNames);
     461                 :            : 
     462                 :            :     /** closes all keys specified in the array.
     463                 :            : 
     464                 :            :         @param  rSubKeys reference a RegistryKeyArray which contains the open keys.
     465                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     466                 :            :     */
     467                 :            :     inline RegError closeSubKeys(RegistryKeyArray& rSubKeys);
     468                 :            : 
     469                 :            :     /** deletes the specified key.
     470                 :            : 
     471                 :            :         @param  keyName specifies the name of the key which will be deleted.
     472                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     473                 :            :     */
     474                 :            :     inline RegError deleteKey(const ::rtl::OUString& keyName);
     475                 :            : 
     476                 :            :     /// closes explicitly the current key
     477                 :            :     inline RegError closeKey();
     478                 :            : 
     479                 :            :     /// releases the current key
     480                 :            :     inline void releaseKey();
     481                 :            : 
     482                 :            :     /** sets a value of a key.
     483                 :            : 
     484                 :            :         @param  keyName specifies the name of the key which value will be set.
     485                 :            :                         If keyName is an empty string, the value will be set for the key
     486                 :            :                         specified by hKey.
     487                 :            :         @param  valueType specifies the type of the value.
     488                 :            :         @param  pValue points to a memory block containing the data for the value.
     489                 :            :         @param  valueSize specifies the size of pData in bytes
     490                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     491                 :            :     */
     492                 :            :     inline RegError setValue(const ::rtl::OUString& keyName,
     493                 :            :                                 RegValueType valueType,
     494                 :            :                                 RegValue pValue,
     495                 :            :                                 sal_uInt32 valueSize);
     496                 :            : 
     497                 :            :     /** sets a long list value of a key.
     498                 :            : 
     499                 :            :         @param  keyName specifies the name of the key which value will be set.
     500                 :            :                         If keyName is an empty string, the value will be set for the key
     501                 :            :                         specified by hKey.
     502                 :            :         @param  pValueList points to an array of longs containing the data for the value.
     503                 :            :         @param  len specifies the length of the list (the array referenced by pValueList).
     504                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     505                 :            :     */
     506                 :            :     inline RegError setLongListValue(const ::rtl::OUString& keyName,
     507                 :            :                                          sal_Int32* pValueList,
     508                 :            :                                          sal_uInt32 len);
     509                 :            : 
     510                 :            :     /** sets an ascii list value of a key.
     511                 :            : 
     512                 :            :         @param  keyName specifies the name of the key which value will be set.
     513                 :            :                         If keyName is an empty string, the value will be set for the key
     514                 :            :                         specified by hKey.
     515                 :            :         @param  pValueList points to an array of sal_Char* containing the data for the value.
     516                 :            :         @param  len specifies the length of the list (the array referenced by pValueList).
     517                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     518                 :            :     */
     519                 :            :     inline RegError setStringListValue(const ::rtl::OUString& keyName,
     520                 :            :                                            sal_Char** pValueList,
     521                 :            :                                            sal_uInt32 len);
     522                 :            : 
     523                 :            :     /** sets an unicode string list value of a key.
     524                 :            : 
     525                 :            :         @param  keyName specifies the name of the key which value will be set.
     526                 :            :                         If keyName is an empty string, the value will be set for the key
     527                 :            :                         specified by hKey.
     528                 :            :         @param  pValueList points to an array of sal_Unicode* containing the data for the value.
     529                 :            :         @param  len specifies the length of the list (the array referenced by pValueList).
     530                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     531                 :            :     */
     532                 :            :     inline RegError setUnicodeListValue(const ::rtl::OUString& keyName,
     533                 :            :                                             sal_Unicode** pValueList,
     534                 :            :                                               sal_uInt32 len);
     535                 :            : 
     536                 :            :     /** gets info about type and size of a value.
     537                 :            : 
     538                 :            :         @param  keyName specifies the name of the key which value info will be returned.
     539                 :            :                         If keyName is an empty string, the value info of the key
     540                 :            :                         specified by hKey will be returned.
     541                 :            :         @param  pValueType returns the type of the value.
     542                 :            :         @param  pValueSize returns the size of the value in bytes or the length of a list value.
     543                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     544                 :            :     */
     545                 :            :     inline RegError getValueInfo(const ::rtl::OUString& keyName,
     546                 :            :                                     RegValueType* pValueType,
     547                 :            :                                     sal_uInt32* pValueSize);
     548                 :            : 
     549                 :            :     /** gets the value of a key.
     550                 :            : 
     551                 :            :         @param  keyName specifies the name of the key which value will be returned.
     552                 :            :                         If keyName is an empty string, the value is get from the key
     553                 :            :                         specified by hKey.
     554                 :            :         @param  pValue points to an allocated memory block receiving the data of the value.
     555                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     556                 :            :     */
     557                 :            :     inline RegError getValue(const ::rtl::OUString& keyName,
     558                 :            :                                 RegValue pValue);
     559                 :            : 
     560                 :            :     /** gets a long list value of a key.
     561                 :            : 
     562                 :            :         @param  keyName specifies the name of the key which value will be returned.
     563                 :            :                         If keyName is an empty string, the value is get from the key
     564                 :            :                         specified by hKey.
     565                 :            :         @param  rValueList references a RegistryValueList which will be filled with the long values.
     566                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     567                 :            :     */
     568                 :            :     inline RegError getLongListValue(const ::rtl::OUString& keyName,
     569                 :            :                                           RegistryValueList<sal_Int32>& rValueList);
     570                 :            : 
     571                 :            :     /** gets an ascii list value of a key.
     572                 :            : 
     573                 :            :         @param  keyName specifies the name of the key which value will be returned.
     574                 :            :                         If keyName is an empty string, the value is get from the key
     575                 :            :                         specified by hKey.
     576                 :            :         @param  rValueList references a RegistryValueList which will be filled with the ascii values.
     577                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     578                 :            :     */
     579                 :            :     inline RegError getStringListValue(const ::rtl::OUString& keyName,
     580                 :            :                                            RegistryValueList<sal_Char*>& rValueList);
     581                 :            : 
     582                 :            :     /** gets a unicode value of a key.
     583                 :            : 
     584                 :            :         @param  keyName specifies the name of the key which value will be returned.
     585                 :            :                         If keyName is an empty string, the value is get from the key
     586                 :            :                         specified by hKey.
     587                 :            :         @param  rValueList reference a RegistryValueList which will be filled with the unicode values.
     588                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     589                 :            :     */
     590                 :            :     inline RegError getUnicodeListValue(const ::rtl::OUString& keyName,
     591                 :            :                                               RegistryValueList<sal_Unicode*>& rValueList);
     592                 :            : 
     593                 :            :     /** used to create a link.
     594                 :            : 
     595                 :            :         @deprecated Links are no longer supported.
     596                 :            : 
     597                 :            :         @return REG_INVALID_LINK
     598                 :            :      */
     599                 :            :     inline RegError createLink(const ::rtl::OUString& linkName,
     600                 :            :                                const ::rtl::OUString& linkTarget);
     601                 :            : 
     602                 :            :     /** used to delete a link.
     603                 :            : 
     604                 :            :         @deprecated Links are no longer supported.
     605                 :            : 
     606                 :            :         @return REG_INVALID_LINK
     607                 :            :      */
     608                 :            :     inline RegError deleteLink(const ::rtl::OUString& linkName);
     609                 :            : 
     610                 :            :     /** returns the type of the specified key.
     611                 :            : 
     612                 :            :         @param name specifies the name of the key or link.
     613                 :            :         @param pKeyType returns the type of the key (always RG_KEYTYPE).
     614                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     615                 :            :      */
     616                 :            :     inline RegError getKeyType(const ::rtl::OUString& name,
     617                 :            :                                   RegKeyType* pKeyType) const;
     618                 :            : 
     619                 :            :     /** used to return the target of a link.
     620                 :            : 
     621                 :            :         @deprecated Links are no longer supported.
     622                 :            : 
     623                 :            :         @return REG_INVALID_LINK
     624                 :            :      */
     625                 :            :     inline RegError getLinkTarget(const ::rtl::OUString& linkName,
     626                 :            :                                     ::rtl::OUString& rLinkTarget) const;
     627                 :            : 
     628                 :            :     /** resolves a keyname.
     629                 :            : 
     630                 :            :         @param  keyName specifies the name of the key which will be resolved relativ to this key.
     631                 :            :                         The resolved name will be prefixed with the name of this key.
     632                 :            :         @param firstLinkOnly ignored
     633                 :            :         @return REG_NO_ERROR if succeeds else an error code.
     634                 :            :      */
     635                 :            :     inline RegError getResolvedKeyName(const ::rtl::OUString& keyName,
     636                 :            :                                        sal_Bool firstLinkOnly,
     637                 :            :                                            ::rtl::OUString& rResolvedName) const;
     638                 :            : 
     639                 :            :     /// returns the name of the registry in which the key is defined.
     640                 :            :     inline ::rtl::OUString getRegistryName();
     641                 :            : 
     642                 :            :     /// returns the registry in which the key is defined.
     643                 :            :     Registry getRegistry() const { return m_registry; }
     644                 :            : 
     645                 :            :     friend class Registry;
     646                 :            : public:
     647                 :            :     /// @cond INTERNAL
     648                 :            : 
     649                 :            :     /** Constructor, which initialize a RegistryKey with registry and an valid key handle.
     650                 :            : 
     651                 :            :         This constructor is internal only.
     652                 :            :     */
     653                 :            :     inline RegistryKey(Registry&    registry,
     654                 :            :                        RegKeyHandle hKey);
     655                 :            : 
     656                 :            :     /** returns the internal key handle.
     657                 :            :      */
     658                 :            :     RegKeyHandle getKeyHandle() const { return m_hImpl; }
     659                 :            : 
     660                 :            : protected:
     661                 :            :     /** sets the internal registry on which this key should work.
     662                 :            :      */
     663                 :            :     inline void setRegistry(Registry& registry);
     664                 :            : 
     665                 :            :     /// @endcond
     666                 :            : 
     667                 :            :     /// stores the registry on which this key works
     668                 :            :     Registry        m_registry;
     669                 :            :     /// stores the current key handle of this key
     670                 :            :     RegKeyHandle    m_hImpl;
     671                 :            : };
     672                 :            : 
     673                 :            : 
     674                 :            : //-----------------------------------------------------------------------------
     675                 :            : 
     676                 :      30200 : inline RegistryKeyArray::RegistryKeyArray()
     677                 :            :     : m_length(0)
     678                 :      30200 :     , m_phKeys(NULL)
     679                 :            : {
     680                 :      30200 : }
     681                 :            : 
     682                 :      30200 : inline RegistryKeyArray::~RegistryKeyArray()
     683                 :            : {
     684         [ +  + ]:      30200 :     if (m_phKeys)
     685         [ +  - ]:       1418 :         m_registry.m_pApi->closeSubKeys(m_phKeys, m_length);
     686                 :      30200 : }
     687                 :            : 
     688                 :      30300 : inline RegistryKey RegistryKeyArray::getElement(sal_uInt32 index)
     689                 :            : {
     690 [ +  - ][ +  - ]:      30300 :     if (m_registry.isValid() && index < m_length)
                 [ +  - ]
     691                 :      30300 :         return RegistryKey(m_registry, m_phKeys[index]);
     692                 :            :     else
     693                 :      30300 :         return RegistryKey();
     694                 :            : }
     695                 :            : 
     696                 :      59890 : inline sal_uInt32 RegistryKeyArray::getLength()
     697                 :            : {
     698                 :      59890 :     return m_length;
     699                 :            : }
     700                 :            : 
     701                 :      30102 : inline void RegistryKeyArray::setKeyHandles(Registry& registry,
     702                 :            :                                             RegKeyHandle* phKeys,
     703                 :            :                                             sal_uInt32 length)
     704                 :            : {
     705                 :      30102 :     m_phKeys = phKeys;
     706                 :      30102 :     m_length = length;
     707                 :      30102 :     m_registry = registry;
     708                 :      30102 : }
     709                 :            : 
     710                 :            : inline RegError RegistryKeyArray::closeKeyHandles()
     711                 :            : {
     712                 :            :     if (m_registry.isValid() && m_phKeys)
     713                 :            :     {
     714                 :            :         RegError ret;
     715                 :            :         ret = m_registry.m_pApi->closeSubKeys(m_phKeys, m_length);
     716                 :            :         m_registry = Registry();
     717                 :            :         m_length = 0;
     718                 :            :         m_phKeys = NULL;
     719                 :            :         return ret;
     720                 :            :     } else
     721                 :            :         return(REG_INVALID_KEY);
     722                 :            : }
     723                 :            : 
     724                 :            : //-----------------------------------------------------------------------------
     725                 :            : 
     726                 :      18706 : inline RegistryKeyNames::RegistryKeyNames()
     727                 :            :     : m_length(0)
     728                 :      18706 :     , m_pKeyNames(NULL)
     729                 :            : {
     730                 :      18706 : }
     731                 :            : 
     732                 :      18706 : inline RegistryKeyNames::~RegistryKeyNames()
     733                 :            : {
     734         [ +  + ]:      18706 :     if (m_pKeyNames)
     735         [ +  - ]:       1686 :         m_registry.m_pApi->freeKeyNames(m_pKeyNames, m_length);
     736                 :      18706 : }
     737                 :            : 
     738                 :    2028034 : inline ::rtl::OUString RegistryKeyNames::getElement(sal_uInt32 index)
     739                 :            : {
     740                 :            : 
     741 [ +  - ][ +  - ]:    2028034 :     if (m_pKeyNames && index < m_length)
     742                 :    2028034 :         return m_pKeyNames[index];
     743                 :            :     else
     744                 :    2028034 :         return ::rtl::OUString();
     745                 :            : }
     746                 :            : 
     747                 :      18902 : inline sal_uInt32 RegistryKeyNames::getLength()
     748                 :            : {
     749                 :      18902 :     return m_length;
     750                 :            : }
     751                 :            : 
     752                 :      18706 : inline void RegistryKeyNames::setKeyNames(Registry& registry,
     753                 :            :                                           rtl_uString** pKeyNames,
     754                 :            :                                           sal_uInt32 length)
     755                 :            : {
     756                 :      18706 :     m_pKeyNames = pKeyNames;
     757                 :      18706 :     m_length = length;
     758                 :      18706 :     m_registry = registry;
     759                 :      18706 : }
     760                 :            : 
     761                 :            : inline RegError RegistryKeyNames::freeKeyNames()
     762                 :            : {
     763                 :            :     if (m_registry.isValid() && m_pKeyNames)
     764                 :            :     {
     765                 :            :         RegError ret = REG_NO_ERROR;
     766                 :            :         ret = m_registry.m_pApi->freeKeyNames(m_pKeyNames, m_length);
     767                 :            :         m_registry = Registry();
     768                 :            :         m_length = 0;
     769                 :            :         m_pKeyNames = NULL;
     770                 :            :         return ret;
     771                 :            :     } else
     772                 :            :         return REG_INVALID_KEY;
     773                 :            : }
     774                 :            : 
     775                 :            : //-----------------------------------------------------------------------------
     776                 :            : 
     777                 :    1924976 : inline RegistryKey::RegistryKey()
     778                 :    1924976 :     : m_hImpl(NULL)
     779                 :    1924976 :     { }
     780                 :            : 
     781                 :            : /// @cond INTERNAL
     782                 :      30300 : inline RegistryKey::RegistryKey(Registry& registry, RegKeyHandle hKey)
     783                 :            :     : m_registry(registry)
     784                 :      30300 :     , m_hImpl(hKey)
     785                 :            :     {
     786         [ +  - ]:      30300 :         if (m_hImpl)
     787         [ +  - ]:      30300 :             m_registry.m_pApi->acquireKey(m_hImpl);
     788                 :      30300 :     }
     789                 :            : /// @endcond
     790                 :            : 
     791                 :     751103 : inline RegistryKey::RegistryKey(const RegistryKey& toCopy)
     792                 :            :     : m_registry(toCopy.m_registry)
     793                 :     751103 :     , m_hImpl(toCopy.m_hImpl)
     794                 :            :     {
     795         [ +  - ]:     751103 :         if (m_hImpl)
     796         [ +  - ]:     751103 :             m_registry.m_pApi->acquireKey(m_hImpl);
     797                 :     751103 :     }
     798                 :            : 
     799                 :            : /// @cond INTERNAL
     800                 :    1538612 : inline void RegistryKey::setRegistry(Registry& registry)
     801                 :            :     {
     802                 :    1538612 :         m_registry = registry;
     803                 :    1538612 :     }
     804                 :            : /// @endcond
     805                 :            : 
     806                 :    2705284 : inline RegistryKey::~RegistryKey()
     807                 :            :     {
     808         [ +  + ]:    2705284 :         if (m_hImpl)
     809         [ +  - ]:    1926076 :             m_registry.m_pApi->releaseKey(m_hImpl);
     810                 :    2705284 :     }
     811                 :            : 
     812                 :      65305 : inline RegistryKey& RegistryKey::operator = (const RegistryKey& toAssign)
     813                 :            : {
     814                 :      65305 :     m_registry = toAssign.m_registry;
     815                 :            : 
     816         [ +  - ]:      65305 :     if (toAssign.m_hImpl)
     817                 :      65305 :         m_registry.m_pApi->acquireKey(toAssign.m_hImpl);
     818         [ +  + ]:      65305 :     if (m_hImpl)
     819                 :      28775 :         m_registry.m_pApi->releaseKey(m_hImpl);
     820                 :      65305 :     m_hImpl = toAssign.m_hImpl;
     821                 :            : 
     822                 :      65305 :     return *this;
     823                 :            : }
     824                 :            : 
     825                 :    2148300 : inline sal_Bool RegistryKey::isValid() const
     826                 :    2148300 :     {  return (m_hImpl != NULL); }
     827                 :            : 
     828                 :         64 : inline sal_Bool RegistryKey::isReadOnly() const
     829                 :            :     {
     830         [ +  - ]:         64 :         if  (m_registry.isValid())
     831                 :         64 :             return (m_registry.m_pApi)->isKeyReadOnly(m_hImpl);
     832                 :            :         else
     833                 :         64 :             return sal_False;
     834                 :            :     }
     835                 :            : 
     836                 :     214240 : inline ::rtl::OUString RegistryKey::getName()
     837                 :            :     {
     838                 :     214240 :         ::rtl::OUString sRet;
     839         [ +  - ]:     214240 :         if (m_registry.isValid())
     840         [ +  - ]:     214240 :             m_registry.m_pApi->getKeyName(m_hImpl, &sRet.pData);
     841                 :     214240 :         return sRet;
     842                 :            :     }
     843                 :            : 
     844                 :      32280 : inline RegError RegistryKey::createKey(const ::rtl::OUString& keyName,
     845                 :            :                                           RegistryKey& rNewKey)
     846                 :            :     {
     847         [ -  + ]:      32280 :         if (rNewKey.isValid()) rNewKey.closeKey();
     848         [ +  - ]:      32280 :         if (m_registry.isValid())
     849                 :            :         {
     850                 :      32280 :             RegError ret = m_registry.m_pApi->createKey(m_hImpl, keyName.pData, &rNewKey.m_hImpl);
     851         [ +  - ]:      32280 :             if (!ret) rNewKey.setRegistry(m_registry);
     852                 :      32280 :             return ret;
     853                 :            :         } else
     854                 :      32280 :             return REG_INVALID_KEY;
     855                 :            :     }
     856                 :            : 
     857                 :     888352 : inline RegError RegistryKey::openKey(const ::rtl::OUString& keyName,
     858                 :            :                                      RegistryKey& rOpenKey)
     859                 :            :     {
     860         [ +  + ]:     888352 :         if (rOpenKey.isValid()) rOpenKey.closeKey();
     861         [ +  - ]:     888352 :         if (m_registry.isValid())
     862                 :            :         {
     863                 :            :             RegError ret = m_registry.m_pApi->openKey(m_hImpl, keyName.pData,
     864                 :     888352 :                                                     &rOpenKey.m_hImpl);
     865         [ +  + ]:     888352 :             if (!ret) rOpenKey.setRegistry(m_registry);
     866                 :     888352 :             return ret;
     867                 :            :         } else
     868                 :     888352 :             return REG_INVALID_KEY;
     869                 :            :     }
     870                 :            : 
     871                 :      30200 : inline RegError RegistryKey::openSubKeys(const ::rtl::OUString& keyName,
     872                 :            :                                          RegistryKeyArray& rSubKeys)
     873                 :            :     {
     874         [ +  - ]:      30200 :         if (m_registry.isValid())
     875                 :            :         {
     876                 :      30200 :             RegError        ret = REG_NO_ERROR;
     877                 :            :             RegKeyHandle*   pSubKeys;
     878                 :            :             sal_uInt32      nSubKeys;
     879                 :            :              ret = m_registry.m_pApi->openSubKeys(m_hImpl, keyName.pData,
     880         [ +  - ]:      30200 :                                                       &pSubKeys, &nSubKeys);
     881         [ +  + ]:      30200 :              if ( ret )
     882                 :            :             {
     883                 :         98 :                 return ret;
     884                 :            :             } else
     885                 :            :             {
     886         [ +  - ]:      30102 :                 rSubKeys.setKeyHandles(m_registry, pSubKeys, nSubKeys);
     887                 :      30200 :                 return ret;
     888                 :            :             }
     889                 :            :         } else
     890                 :      30200 :             return REG_INVALID_KEY;
     891                 :            :     }
     892                 :            : 
     893                 :      18706 : inline RegError RegistryKey::getKeyNames(const ::rtl::OUString& keyName,
     894                 :            :                                              RegistryKeyNames& rSubKeyNames)
     895                 :            :     {
     896         [ +  - ]:      18706 :         if (m_registry.isValid())
     897                 :            :         {
     898                 :      18706 :             RegError        ret = REG_NO_ERROR;
     899                 :            :             rtl_uString**   pSubKeyNames;
     900                 :            :             sal_uInt32      nSubKeys;
     901                 :            :              ret = m_registry.m_pApi->getKeyNames(m_hImpl, keyName.pData,
     902         [ +  - ]:      18706 :                                                   &pSubKeyNames, &nSubKeys);
     903         [ -  + ]:      18706 :              if ( ret )
     904                 :            :             {
     905                 :          0 :                 return ret;
     906                 :            :             } else
     907                 :            :             {
     908         [ +  - ]:      18706 :                 rSubKeyNames.setKeyNames(m_registry, pSubKeyNames, nSubKeys);
     909                 :      18706 :                 return ret;
     910                 :            :             }
     911                 :            :         } else
     912                 :      18706 :             return REG_INVALID_KEY;
     913                 :            :     }
     914                 :            : 
     915                 :            : inline RegError RegistryKey::closeSubKeys(RegistryKeyArray& rSubKeys)
     916                 :            :     {
     917                 :            :         if (m_registry.isValid())
     918                 :            :             return rSubKeys.closeKeyHandles();
     919                 :            :         else
     920                 :            :             return REG_INVALID_KEY;
     921                 :            :     }
     922                 :            : 
     923                 :          4 : inline RegError RegistryKey::deleteKey(const ::rtl::OUString& keyName)
     924                 :            :     {
     925         [ +  - ]:          4 :         if (m_registry.isValid())
     926                 :          4 :             return m_registry.m_pApi->deleteKey(m_hImpl, keyName.pData);
     927                 :            :         else
     928                 :          4 :             return REG_INVALID_KEY;
     929                 :            :     }
     930                 :            : 
     931                 :      94925 : inline RegError RegistryKey::closeKey()
     932                 :            :     {
     933         [ +  - ]:      94925 :         if (m_registry.isValid())
     934                 :            :         {
     935                 :      94925 :             RegError ret = m_registry.m_pApi->closeKey(m_hImpl);
     936         [ +  - ]:      94925 :             if (!ret)
     937                 :            :             {
     938                 :      94925 :                 m_hImpl = NULL;
     939         [ +  - ]:      94925 :                 m_registry = Registry();
     940                 :            :             }
     941                 :      94925 :             return ret;
     942                 :            :         } else
     943                 :      94925 :             return REG_INVALID_KEY;
     944                 :            :     }
     945                 :            : 
     946                 :      11980 : inline void RegistryKey::releaseKey()
     947                 :            : {
     948 [ +  - ][ +  - ]:      11980 :     if (m_registry.isValid() && (m_hImpl != 0))
                 [ +  - ]
     949                 :            :     {
     950                 :      11980 :         m_registry.m_pApi->releaseKey(m_hImpl), m_hImpl = 0;
     951                 :            :     }
     952                 :      11980 : }
     953                 :            : 
     954                 :      31016 : inline RegError RegistryKey::setValue(const ::rtl::OUString& keyName,
     955                 :            :                                               RegValueType valueType,
     956                 :            :                                            RegValue pValue,
     957                 :            :                                               sal_uInt32 valueSize)
     958                 :            :     {
     959         [ +  - ]:      31016 :         if (m_registry.isValid())
     960                 :            :             return m_registry.m_pApi->setValue(m_hImpl, keyName.pData, valueType,
     961                 :      31016 :                                                 pValue, valueSize);
     962                 :            :         else
     963                 :      31016 :             return REG_INVALID_KEY;
     964                 :            :     }
     965                 :            : 
     966                 :          0 : inline RegError RegistryKey::setLongListValue(const ::rtl::OUString& keyName,
     967                 :            :                                                   sal_Int32* pValueList,
     968                 :            :                                                   sal_uInt32 len)
     969                 :            :     {
     970         [ #  # ]:          0 :         if (m_registry.isValid())
     971                 :            :             return m_registry.m_pApi->setLongListValue(m_hImpl, keyName.pData,
     972                 :          0 :                                                            pValueList, len);
     973                 :            :         else
     974                 :          0 :             return REG_INVALID_KEY;
     975                 :            :     }
     976                 :            : 
     977                 :        126 : inline RegError RegistryKey::setStringListValue(const ::rtl::OUString& keyName,
     978                 :            :                                                    sal_Char** pValueList,
     979                 :            :                                                    sal_uInt32 len)
     980                 :            :     {
     981         [ +  - ]:        126 :         if (m_registry.isValid())
     982                 :            :             return m_registry.m_pApi->setStringListValue(m_hImpl, keyName.pData,
     983                 :        126 :                                                             pValueList, len);
     984                 :            :         else
     985                 :        126 :             return REG_INVALID_KEY;
     986                 :            :     }
     987                 :            : 
     988                 :          0 : inline RegError RegistryKey::setUnicodeListValue(const ::rtl::OUString& keyName,
     989                 :            :                                                         sal_Unicode** pValueList,
     990                 :            :                                                         sal_uInt32 len)
     991                 :            :     {
     992         [ #  # ]:          0 :         if (m_registry.isValid())
     993                 :            :             return m_registry.m_pApi->setUnicodeListValue(m_hImpl, keyName.pData,
     994                 :          0 :                                                               pValueList, len);
     995                 :            :         else
     996                 :          0 :             return REG_INVALID_KEY;
     997                 :            :     }
     998                 :            : 
     999                 :     257151 : inline RegError RegistryKey::getValueInfo(const ::rtl::OUString& keyName,
    1000                 :            :                                                   RegValueType* pValueType,
    1001                 :            :                                                   sal_uInt32* pValueSize)
    1002                 :            :     {
    1003         [ +  - ]:     257151 :         if (m_registry.isValid())
    1004                 :     257151 :             return m_registry.m_pApi->getValueInfo(m_hImpl, keyName.pData, pValueType, pValueSize);
    1005                 :            :         else
    1006                 :     257151 :             return REG_INVALID_KEY;
    1007                 :            :     }
    1008                 :            : 
    1009                 :     186564 : inline RegError RegistryKey::getValue(const ::rtl::OUString& keyName,
    1010                 :            :                                         RegValue pValue)
    1011                 :            :     {
    1012         [ +  - ]:     186564 :         if (m_registry.isValid())
    1013                 :     186564 :             return m_registry.m_pApi->getValue(m_hImpl, keyName.pData, pValue);
    1014                 :            :         else
    1015                 :     186564 :             return REG_INVALID_KEY;
    1016                 :            :     }
    1017                 :            : 
    1018                 :          0 : inline RegError RegistryKey::getLongListValue(const ::rtl::OUString& keyName,
    1019                 :            :                                               RegistryValueList<sal_Int32>& rValueList)
    1020                 :            :     {
    1021         [ #  # ]:          0 :         if (m_registry.isValid())
    1022                 :            :         {
    1023                 :          0 :             RegError    ret = REG_NO_ERROR;
    1024                 :            :             sal_Int32*  pValueList;
    1025                 :            :             sal_uInt32  length;
    1026                 :            :              ret = m_registry.m_pApi->getLongListValue(m_hImpl, keyName.pData,
    1027         [ #  # ]:          0 :                                                       &pValueList, &length);
    1028         [ #  # ]:          0 :              if ( ret )
    1029                 :            :             {
    1030                 :          0 :                 return ret;
    1031                 :            :             } else
    1032                 :            :             {
    1033                 :            :                 rValueList.setValueList(m_registry, RG_VALUETYPE_LONGLIST,
    1034         [ #  # ]:          0 :                                         pValueList, length);
    1035                 :          0 :                 return ret;
    1036                 :            :             }
    1037                 :            :         } else
    1038                 :          0 :             return REG_INVALID_KEY;
    1039                 :            :     }
    1040                 :            : 
    1041                 :          0 : inline RegError RegistryKey::getStringListValue(const ::rtl::OUString& keyName,
    1042                 :            :                                                       RegistryValueList<sal_Char*>& rValueList)
    1043                 :            :     {
    1044         [ #  # ]:          0 :         if (m_registry.isValid())
    1045                 :            :         {
    1046                 :          0 :             RegError    ret = REG_NO_ERROR;
    1047                 :            :             sal_Char**  pValueList;
    1048                 :            :             sal_uInt32  length;
    1049                 :            :              ret = m_registry.m_pApi->getStringListValue(m_hImpl, keyName.pData,
    1050         [ #  # ]:          0 :                                                       &pValueList, &length);
    1051         [ #  # ]:          0 :              if ( ret )
    1052                 :            :             {
    1053                 :          0 :                 return ret;
    1054                 :            :             } else
    1055                 :            :             {
    1056                 :            :                 rValueList.setValueList(m_registry, RG_VALUETYPE_STRINGLIST,
    1057         [ #  # ]:          0 :                                         pValueList, length);
    1058                 :          0 :                 return ret;
    1059                 :            :             }
    1060                 :            :         } else
    1061                 :          0 :             return REG_INVALID_KEY;
    1062                 :            :     }
    1063                 :            : 
    1064                 :          0 : inline RegError RegistryKey::getUnicodeListValue(const ::rtl::OUString& keyName,
    1065                 :            :                                               RegistryValueList<sal_Unicode*>& rValueList)
    1066                 :            :     {
    1067         [ #  # ]:          0 :         if (m_registry.isValid())
    1068                 :            :         {
    1069                 :          0 :             RegError        ret = REG_NO_ERROR;
    1070                 :            :             sal_Unicode**   pValueList;
    1071                 :            :             sal_uInt32      length;
    1072                 :            :              ret = m_registry.m_pApi->getUnicodeListValue(m_hImpl, keyName.pData,
    1073         [ #  # ]:          0 :                                                       &pValueList, &length);
    1074         [ #  # ]:          0 :              if ( ret )
    1075                 :            :             {
    1076                 :          0 :                 return ret;
    1077                 :            :             } else
    1078                 :            :             {
    1079                 :            :                 rValueList.setValueList(m_registry, RG_VALUETYPE_UNICODELIST,
    1080         [ #  # ]:          0 :                                         pValueList, length);
    1081                 :          0 :                 return ret;
    1082                 :            :             }
    1083                 :            :         } else
    1084                 :          0 :             return REG_INVALID_KEY;
    1085                 :            :     }
    1086                 :            : 
    1087                 :          0 : inline RegError RegistryKey::createLink(const ::rtl::OUString& linkName,
    1088                 :            :                                            const ::rtl::OUString& linkTarget)
    1089                 :            :     {
    1090         [ #  # ]:          0 :         if (m_registry.isValid())
    1091                 :          0 :             return m_registry.m_pApi->createLink(m_hImpl, linkName.pData, linkTarget.pData);
    1092                 :            :         else
    1093                 :          0 :             return REG_INVALID_KEY;
    1094                 :            :     }
    1095                 :            : 
    1096                 :          0 : inline RegError RegistryKey::deleteLink(const ::rtl::OUString& linkName)
    1097                 :            :     {
    1098         [ #  # ]:          0 :         if (m_registry.isValid())
    1099                 :          0 :             return m_registry.m_pApi->deleteLink(m_hImpl, linkName.pData);
    1100                 :            :         else
    1101                 :          0 :             return REG_INVALID_KEY;
    1102                 :            :     }
    1103                 :            : 
    1104                 :        820 : inline RegError RegistryKey::getKeyType(const ::rtl::OUString& keyName,
    1105                 :            :                                               RegKeyType* pKeyType) const
    1106                 :            :     {
    1107         [ +  - ]:        820 :         if (m_registry.isValid())
    1108                 :        820 :             return m_registry.m_pApi->getKeyType(m_hImpl, keyName.pData, pKeyType);
    1109                 :            :         else
    1110                 :        820 :             return REG_INVALID_KEY;
    1111                 :            :     }
    1112                 :            : 
    1113                 :          0 : inline RegError RegistryKey::getLinkTarget(const ::rtl::OUString& linkName,
    1114                 :            :                                                ::rtl::OUString& rLinkTarget) const
    1115                 :            :     {
    1116         [ #  # ]:          0 :         if (m_registry.isValid())
    1117                 :            :         {
    1118                 :            :             return m_registry.m_pApi->getLinkTarget(m_hImpl,
    1119                 :            :                                                     linkName.pData,
    1120                 :          0 :                                                     &rLinkTarget.pData);
    1121                 :            :         } else
    1122                 :          0 :             return REG_INVALID_KEY;
    1123                 :            :     }
    1124                 :            : 
    1125                 :            : 
    1126                 :     267565 : inline RegError RegistryKey::getResolvedKeyName(const ::rtl::OUString& keyName,
    1127                 :            :                                                    sal_Bool firstLinkOnly,
    1128                 :            :                                                        ::rtl::OUString& rResolvedName) const
    1129                 :            :     {
    1130         [ +  - ]:     267565 :         if (m_registry.isValid())
    1131                 :            :             return m_registry.m_pApi->getResolvedKeyName(m_hImpl,
    1132                 :            :                                                          keyName.pData,
    1133                 :            :                                                          firstLinkOnly,
    1134                 :     267565 :                                                          &rResolvedName.pData);
    1135                 :            :         else
    1136                 :     267565 :             return REG_INVALID_KEY;
    1137                 :            :     }
    1138                 :            : 
    1139                 :          0 : inline ::rtl::OUString RegistryKey::getRegistryName()
    1140                 :            :     {
    1141         [ #  # ]:          0 :         if (m_registry.isValid())
    1142                 :            :         {
    1143                 :          0 :             return m_registry.getName();
    1144                 :            :         } else
    1145                 :          0 :             return ::rtl::OUString();
    1146                 :            :     }
    1147                 :            : 
    1148                 :            : //-----------------------------------------------------------------------------
    1149                 :            : 
    1150                 :    2077425 : inline Registry::Registry()
    1151                 :    2077425 :     : m_pApi(initRegistry_Api())
    1152                 :    2077425 :     , m_hImpl(NULL)
    1153                 :    2077425 :     { }
    1154                 :            : 
    1155                 :     781455 : inline Registry::Registry(const Registry& toCopy)
    1156                 :            :     : m_pApi(toCopy.m_pApi)
    1157                 :     781455 :     , m_hImpl(toCopy.m_hImpl)
    1158                 :            :     {
    1159         [ +  - ]:     781455 :         if (m_hImpl)
    1160                 :     781455 :             m_pApi->acquire(m_hImpl);
    1161                 :     781455 :     }
    1162                 :            : 
    1163                 :            : 
    1164                 :    2856633 : inline Registry::~Registry()
    1165                 :            :     {
    1166         [ +  + ]:    2856633 :         if (m_hImpl)
    1167                 :    1987804 :             m_pApi->release(m_hImpl);
    1168                 :    2856633 :     }
    1169                 :            : 
    1170                 :    1747650 : inline Registry& Registry::operator = (const Registry& toAssign)
    1171                 :            : {
    1172         [ +  + ]:    1747650 :     if (toAssign.m_hImpl)
    1173                 :    1652725 :         toAssign.m_pApi->acquire(toAssign.m_hImpl);
    1174         [ +  + ]:    1747650 :     if (m_hImpl)
    1175                 :     446171 :         m_pApi->release(m_hImpl);
    1176                 :            : 
    1177                 :    1747650 :     m_pApi  = toAssign.m_pApi;
    1178                 :    1747650 :     m_hImpl = toAssign.m_hImpl;
    1179                 :            : 
    1180                 :    1747650 :     return *this;
    1181                 :            : }
    1182                 :            : 
    1183                 :    2391378 : inline sal_Bool Registry::isValid() const
    1184                 :    2391378 :     {  return ( m_hImpl != NULL ); }
    1185                 :            : 
    1186                 :          0 : inline sal_Bool Registry::isReadOnly() const
    1187                 :          0 :     {  return m_pApi->isReadOnly(m_hImpl); }
    1188                 :            : 
    1189                 :    1311914 : inline RegError Registry::openRootKey(RegistryKey& rRootKey)
    1190                 :            :     {
    1191                 :    1311914 :         rRootKey.setRegistry(*this);
    1192                 :    1311914 :         return m_pApi->openRootKey(m_hImpl, &rRootKey.m_hImpl);
    1193                 :            :     }
    1194                 :            : 
    1195                 :          0 : inline ::rtl::OUString Registry::getName()
    1196                 :            :     {
    1197                 :          0 :         ::rtl::OUString sRet;
    1198         [ #  # ]:          0 :         m_pApi->getName(m_hImpl, &sRet.pData);
    1199                 :          0 :         return sRet;
    1200                 :            :     }
    1201                 :            : 
    1202                 :       6251 : inline RegError Registry::create(const ::rtl::OUString& registryName)
    1203                 :            :     {
    1204         [ -  + ]:       6251 :         if (m_hImpl)
    1205                 :          0 :             m_pApi->release(m_hImpl);
    1206                 :       6251 :         return m_pApi->createRegistry(registryName.pData, &m_hImpl);
    1207                 :            :     }
    1208                 :            : 
    1209                 :       2532 : inline RegError Registry::open(const ::rtl::OUString& registryName,
    1210                 :            :                                   RegAccessMode accessMode)
    1211                 :            :     {
    1212         [ +  + ]:       2532 :         if (m_hImpl)
    1213                 :         22 :             m_pApi->release(m_hImpl);
    1214                 :       2532 :         return m_pApi->openRegistry(registryName.pData, &m_hImpl, accessMode);
    1215                 :            :     }
    1216                 :            : 
    1217                 :       6256 : inline RegError Registry::close()
    1218                 :            :     {
    1219                 :       6256 :         RegError ret = m_pApi->closeRegistry(m_hImpl);
    1220         [ +  - ]:       6256 :         if (!ret)
    1221                 :       6256 :             m_hImpl = NULL;
    1222                 :       6256 :         return ret;
    1223                 :            :     }
    1224                 :            : 
    1225                 :          0 : inline RegError Registry::destroy(const ::rtl::OUString& registryName)
    1226                 :            :     {
    1227                 :          0 :         RegError ret = m_pApi->destroyRegistry(m_hImpl, registryName.pData);
    1228 [ #  # ][ #  # ]:          0 :         if ( !ret && registryName.isEmpty() )
                 [ #  # ]
    1229                 :          0 :             m_hImpl = NULL;
    1230                 :          0 :         return ret;
    1231                 :            :     }
    1232                 :            : 
    1233                 :            : inline RegError Registry::loadKey(RegistryKey& rKey,
    1234                 :            :                                       const ::rtl::OUString& keyName,
    1235                 :            :                                       const ::rtl::OUString& regFileName)
    1236                 :            :     {  return m_pApi->loadKey(m_hImpl, rKey.m_hImpl, keyName.pData, regFileName.pData); }
    1237                 :            : 
    1238                 :            : inline RegError Registry::saveKey(RegistryKey& rKey,
    1239                 :            :                                      const ::rtl::OUString& keyName,
    1240                 :            :                                      const ::rtl::OUString& regFileName)
    1241                 :            :     {  return m_pApi->saveKey(m_hImpl, rKey.m_hImpl, keyName.pData, regFileName.pData); }
    1242                 :            : 
    1243                 :       9474 : inline RegError Registry::mergeKey(RegistryKey& rKey,
    1244                 :            :                                          const ::rtl::OUString& keyName,
    1245                 :            :                                          const ::rtl::OUString& regFileName,
    1246                 :            :                                          sal_Bool bWarnings,
    1247                 :            :                                          sal_Bool bReport)
    1248                 :       9474 :     {  return m_pApi->mergeKey(m_hImpl, rKey.m_hImpl, keyName.pData, regFileName.pData, bWarnings, bReport); }
    1249                 :            : 
    1250                 :            : inline RegError Registry::dumpRegistry(RegistryKey& rKey)
    1251                 :            :     {  return m_pApi->dumpRegistry(m_hImpl, rKey.m_hImpl); }
    1252                 :            : 
    1253                 :            : 
    1254                 :            : #endif
    1255                 :            : 
    1256                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10