LCOV - code coverage report
Current view: top level - libreoffice/registry/source - reflread.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 528 697 75.8 %
Date: 2012-12-27 Functions: 86 109 78.9 %
Legend: Lines: hit not hit

          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             : 
      21             : #include <memory>
      22             : #include <new>
      23             : 
      24             : #include <string.h>
      25             : #include <sal/types.h>
      26             : #include <osl/endian.h>
      27             : #include <registry/reflread.hxx>
      28             : 
      29             : #include "registry/reader.h"
      30             : #include "registry/version.h"
      31             : 
      32             : #include "reflcnst.hxx"
      33             : 
      34             : #include <cstddef>
      35             : 
      36             : static sal_Char NULL_STRING[1] = { 0 };
      37             : static sal_Unicode NULL_WSTRING[1] = { 0 };
      38             : 
      39             : const sal_uInt32    magic = 0x12345678;
      40             : const sal_uInt16 minorVersion = 0x0000;
      41             : const sal_uInt16 majorVersion = 0x0001;
      42             : 
      43             : /**************************************************************************
      44             : 
      45             :     class BlopObject
      46             : 
      47             :     holds any data in a flat memory buffer
      48             : 
      49             : **************************************************************************/
      50             : 
      51             : class BlopObject
      52             : {
      53             : public:
      54             :     const sal_uInt8* m_pBuffer;
      55             :     sal_uInt32      m_bufferLen;
      56             :     bool            m_isCopied;
      57             : 
      58             :     BlopObject(const sal_uInt8* buffer, sal_uInt32 len, bool copyBuffer);
      59             :         // throws std::bad_alloc
      60             : 
      61             :     ~BlopObject();
      62             : 
      63         738 :     inline sal_uInt8 readBYTE(sal_uInt32 index) const
      64             :     {
      65         738 :         return m_pBuffer[index];
      66             :     }
      67             : 
      68        6153 :     inline sal_Int16 readINT16(sal_uInt32 index) const
      69             :     {
      70        6153 :         return ((m_pBuffer[index] << 8) | (m_pBuffer[index+1] << 0));
      71             :     }
      72             : 
      73     3364489 :     inline sal_uInt16 readUINT16(sal_uInt32 index) const
      74             :     {
      75     3364489 :         return ((m_pBuffer[index] << 8) | (m_pBuffer[index+1] << 0));
      76             :     }
      77             : 
      78       20255 :     inline sal_Int32 readINT32(sal_uInt32 index) const
      79             :     {
      80             :         return (
      81       20255 :             (m_pBuffer[index]   << 24) |
      82       20255 :             (m_pBuffer[index+1] << 16) |
      83       20255 :             (m_pBuffer[index+2] << 8)  |
      84       20255 :             (m_pBuffer[index+3] << 0)
      85       81020 :         );
      86             :     }
      87             : 
      88     1166186 :     inline sal_uInt32 readUINT32(sal_uInt32 index) const
      89             :     {
      90             :         return (
      91     1166186 :             (m_pBuffer[index]   << 24) |
      92     1166186 :             (m_pBuffer[index+1] << 16) |
      93     1166186 :             (m_pBuffer[index+2] << 8)  |
      94     1166186 :             (m_pBuffer[index+3] << 0)
      95     4664744 :         );
      96             :     }
      97             : 
      98          89 :     inline sal_Int64 readINT64(sal_uInt32 index) const
      99             :     {
     100             :         return (
     101          89 :             ((sal_Int64)m_pBuffer[index]   << 56) |
     102          89 :             ((sal_Int64)m_pBuffer[index+1] << 48) |
     103          89 :             ((sal_Int64)m_pBuffer[index+2] << 40) |
     104          89 :             ((sal_Int64)m_pBuffer[index+3] << 32) |
     105          89 :             ((sal_Int64)m_pBuffer[index+4] << 24) |
     106          89 :             ((sal_Int64)m_pBuffer[index+5] << 16) |
     107          89 :             ((sal_Int64)m_pBuffer[index+6] << 8)  |
     108          89 :             ((sal_Int64)m_pBuffer[index+7] << 0)
     109         712 :         );
     110             :     }
     111             : 
     112           2 :     inline sal_uInt64 readUINT64(sal_uInt32 index) const
     113             :     {
     114             :         return (
     115           2 :             ((sal_uInt64)m_pBuffer[index]   << 56) |
     116           2 :             ((sal_uInt64)m_pBuffer[index+1] << 48) |
     117           2 :             ((sal_uInt64)m_pBuffer[index+2] << 40) |
     118           2 :             ((sal_uInt64)m_pBuffer[index+3] << 32) |
     119           2 :             ((sal_uInt64)m_pBuffer[index+4] << 24) |
     120           2 :             ((sal_uInt64)m_pBuffer[index+5] << 16) |
     121           2 :             ((sal_uInt64)m_pBuffer[index+6] << 8)  |
     122           2 :             ((sal_uInt64)m_pBuffer[index+7] << 0)
     123          16 :         );
     124             :     }
     125             : };
     126             : 
     127      511615 : BlopObject::BlopObject(const sal_uInt8* buffer, sal_uInt32 len, bool copyBuffer)
     128             :     : m_bufferLen(len)
     129      511615 :     , m_isCopied(copyBuffer)
     130             : {
     131      511615 :     if (m_isCopied)
     132             :     {
     133       41735 :         m_pBuffer = 0;
     134       41735 :         sal_uInt8* newBuffer = new sal_uInt8[len];
     135       41735 :         memcpy(newBuffer, buffer, len);
     136       41735 :         m_pBuffer = newBuffer;
     137             :     }
     138             :     else
     139             :     {
     140      469880 :         m_pBuffer = buffer;
     141             :     }
     142      511615 : }
     143             : 
     144      511615 : BlopObject::~BlopObject()
     145             : {
     146      511615 :     if (m_isCopied)
     147             :     {
     148       41735 :         delete[] const_cast<sal_uInt8*>(m_pBuffer);
     149             :     }
     150      511615 : }
     151             : 
     152             : /**************************************************************************
     153             : 
     154             :     class StringCache
     155             : 
     156             : **************************************************************************/
     157             : 
     158             : class StringCache
     159             : {
     160             : public:
     161             :     sal_Unicode**   m_stringTable;
     162             :     sal_uInt16      m_numOfStrings;
     163             :     sal_uInt16      m_stringsCopied;
     164             : 
     165             :     StringCache(sal_uInt16 size); // throws std::bad_alloc
     166             :     ~StringCache();
     167             : 
     168             :     const sal_Unicode*  getString(sal_uInt16 index);
     169             :     sal_uInt16 createString(const sal_uInt8* buffer); // throws std::bad_alloc
     170             : };
     171             : 
     172           0 : StringCache::StringCache(sal_uInt16 size)
     173             :     : m_stringTable(NULL)
     174             :     , m_numOfStrings(size)
     175           0 :     , m_stringsCopied(0)
     176             : {
     177           0 :     m_stringTable = new sal_Unicode*[m_numOfStrings];
     178             : 
     179           0 :     for (sal_uInt16 i = 0; i < m_numOfStrings; i++)
     180             :     {
     181           0 :         m_stringTable[i] = NULL;
     182             :     }
     183           0 : }
     184             : 
     185           0 : StringCache::~StringCache()
     186             : {
     187           0 :     if (m_stringTable)
     188             :     {
     189           0 :         for (sal_uInt16 i = 0; i < m_stringsCopied; i++)
     190             :         {
     191           0 :             delete[] m_stringTable[i];
     192             :         }
     193             : 
     194           0 :         delete[] m_stringTable;
     195             :     }
     196           0 : }
     197             : 
     198           0 : const sal_Unicode* StringCache::getString(sal_uInt16 index)
     199             : {
     200           0 :     if ((index > 0) && (index <= m_stringsCopied))
     201           0 :         return m_stringTable[index - 1];
     202             :     else
     203           0 :         return NULL;
     204             : }
     205             : 
     206           0 : sal_uInt16 StringCache::createString(const sal_uInt8* buffer)
     207             : {
     208           0 :     if (m_stringsCopied < m_numOfStrings)
     209             :     {
     210           0 :         sal_uInt32 len = UINT16StringLen(buffer);
     211             : 
     212           0 :         m_stringTable[m_stringsCopied] = new sal_Unicode[len + 1];
     213             : 
     214           0 :         readString(buffer, m_stringTable[m_stringsCopied], (len + 1) * sizeof(sal_Unicode));
     215             : 
     216           0 :         return ++m_stringsCopied;
     217             :     }
     218             :     else
     219           0 :         return 0;
     220             : }
     221             : 
     222             : /**************************************************************************
     223             : 
     224             :     class ConstantPool
     225             : 
     226             : **************************************************************************/
     227             : 
     228             : class ConstantPool : public BlopObject
     229             : {
     230             : public:
     231             : 
     232             :     sal_uInt16  m_numOfEntries;
     233             :     sal_Int32*  m_pIndex;           // index values may be < 0 for cached string constants
     234             : 
     235             :     StringCache* m_pStringCache;
     236             : 
     237      102323 :     ConstantPool(const sal_uInt8* buffer, sal_uInt16 numEntries)
     238             :         : BlopObject(buffer, 0, sal_False)
     239             :         , m_numOfEntries(numEntries)
     240             :         , m_pIndex(NULL)
     241      102323 :         , m_pStringCache(NULL)
     242             :     {
     243      102323 :     }
     244             : 
     245             :     ~ConstantPool();
     246             : 
     247             :     sal_uInt32 parseIndex(); // throws std::bad_alloc
     248             : 
     249             :     CPInfoTag       readTag(sal_uInt16 index);
     250             : 
     251             :     const sal_Char*     readUTF8NameConstant(sal_uInt16 index);
     252             :     sal_Bool            readBOOLConstant(sal_uInt16 index);
     253             :     sal_Int8            readBYTEConstant(sal_uInt16 index);
     254             :     sal_Int16           readINT16Constant(sal_uInt16 index);
     255             :     sal_uInt16          readUINT16Constant(sal_uInt16 index);
     256             :     sal_Int32           readINT32Constant(sal_uInt16 index);
     257             :     sal_uInt32          readUINT32Constant(sal_uInt16 index);
     258             :     sal_Int64           readINT64Constant(sal_uInt16 index);
     259             :     sal_uInt64          readUINT64Constant(sal_uInt16 index);
     260             :     float               readFloatConstant(sal_uInt16 index);
     261             :     double              readDoubleConstant(sal_uInt16 index);
     262             :     const sal_Unicode*  readStringConstant(sal_uInt16 index);
     263             :         // throws std::bad_alloc
     264             :     void                readUIK(sal_uInt16 index, RTUik* uik);
     265             : };
     266             : 
     267      204646 : ConstantPool::~ConstantPool()
     268             : {
     269      102323 :     delete[] m_pIndex;
     270      102323 :     delete m_pStringCache;
     271      102323 : }
     272             : 
     273      102323 : sal_uInt32 ConstantPool::parseIndex()
     274             : {
     275      102323 :     if (m_pIndex)
     276             :     {
     277           0 :         delete[] m_pIndex;
     278           0 :         m_pIndex = NULL;
     279             :     }
     280             : 
     281      102323 :     if (m_pStringCache)
     282             :     {
     283           0 :         delete m_pStringCache;
     284           0 :         m_pStringCache = NULL;
     285             :     }
     286             : 
     287      102323 :     sal_uInt32  offset = 0;
     288      102323 :     sal_uInt16  numOfStrings = 0;
     289             : 
     290      102323 :     if (m_numOfEntries)
     291             :     {
     292      102323 :         m_pIndex = new sal_Int32[m_numOfEntries];
     293             : 
     294     1063801 :         for (int i = 0; i < m_numOfEntries; i++)
     295             :         {
     296      961478 :             m_pIndex[i] = offset;
     297             : 
     298      961478 :             offset += readUINT32(offset);
     299             : 
     300      961478 :             if ( ((CPInfoTag) readUINT16(m_pIndex[i] + CP_OFFSET_ENTRY_TAG)) ==
     301             :                  CP_TAG_CONST_STRING )
     302             :             {
     303           0 :                 numOfStrings++;
     304             :             }
     305             : 
     306             :         }
     307             :     }
     308             : 
     309      102323 :     if (numOfStrings)
     310             :     {
     311           0 :         m_pStringCache = new StringCache(numOfStrings);
     312             :     }
     313             : 
     314      102323 :     m_bufferLen = offset;
     315             : 
     316      102323 :     return offset;
     317             : }
     318             : 
     319       30199 : CPInfoTag ConstantPool::readTag(sal_uInt16 index)
     320             : {
     321       30199 :     CPInfoTag tag = CP_TAG_INVALID;
     322             : 
     323       30199 :     if (m_pIndex && (index > 0) && (index <= m_numOfEntries))
     324             :     {
     325       27301 :         tag = (CPInfoTag) readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG);
     326             :     }
     327             : 
     328       30199 :     return tag;
     329             : }
     330             : 
     331      419403 : const sal_Char* ConstantPool::readUTF8NameConstant(sal_uInt16 index)
     332             : {
     333      419403 :     const sal_Char* aName = NULL_STRING;
     334             : 
     335      419403 :     if (m_pIndex && (index > 0) && (index <= m_numOfEntries))
     336             :     {
     337      400500 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_UTF8_NAME)
     338             :         {
     339      400500 :             aName = (const sal_Char*) (m_pBuffer + m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     340             :         }
     341             :     }
     342             : 
     343      419403 :     return aName;
     344             : }
     345             : 
     346           0 : sal_Bool ConstantPool::readBOOLConstant(sal_uInt16 index)
     347             : {
     348           0 :     sal_Bool aBool = sal_False;
     349             : 
     350           0 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     351             :     {
     352           0 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_BOOL)
     353             :         {
     354           0 :             aBool = (sal_Bool) readBYTE(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     355             :         }
     356             :     }
     357             : 
     358           0 :     return aBool;
     359             : }
     360             : 
     361         738 : sal_Int8 ConstantPool::readBYTEConstant(sal_uInt16 index)
     362             : {
     363         738 :     sal_Int8 aByte = 0;
     364             : 
     365         738 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     366             :     {
     367         738 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_BYTE)
     368             :         {
     369             :             aByte = static_cast< sal_Int8 >(
     370         738 :                 readBYTE(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA));
     371             :         }
     372             :     }
     373             : 
     374         738 :     return aByte;
     375             : }
     376             : 
     377        6153 : sal_Int16 ConstantPool::readINT16Constant(sal_uInt16 index)
     378             : {
     379        6153 :     sal_Int16 aINT16 = sal_False;
     380             : 
     381        6153 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     382             :     {
     383        6153 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_INT16)
     384             :         {
     385        6153 :             aINT16 = readINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     386             :         }
     387             :     }
     388             : 
     389        6153 :     return aINT16;
     390             : }
     391             : 
     392           2 : sal_uInt16 ConstantPool::readUINT16Constant(sal_uInt16 index)
     393             : {
     394           2 :     sal_uInt16 asal_uInt16 = sal_False;
     395             : 
     396           2 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     397             :     {
     398           2 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_UINT16)
     399             :         {
     400           2 :             asal_uInt16 = readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     401             :         }
     402             :     }
     403             : 
     404           2 :     return asal_uInt16;
     405             : }
     406             : 
     407       20255 : sal_Int32 ConstantPool::readINT32Constant(sal_uInt16 index)
     408             : {
     409       20255 :     sal_Int32 aINT32 = sal_False;
     410             : 
     411       20255 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     412             :     {
     413       20255 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_INT32)
     414             :         {
     415       20255 :             aINT32 = readINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     416             :         }
     417             :     }
     418             : 
     419       20255 :     return aINT32;
     420             : }
     421             : 
     422           2 : sal_uInt32 ConstantPool::readUINT32Constant(sal_uInt16 index)
     423             : {
     424           2 :     sal_uInt32 aUINT32 = sal_False;
     425             : 
     426           2 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     427             :     {
     428           2 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_UINT32)
     429             :         {
     430           2 :             aUINT32 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     431             :         }
     432             :     }
     433             : 
     434           2 :     return aUINT32;
     435             : }
     436             : 
     437          89 : sal_Int64 ConstantPool::readINT64Constant(sal_uInt16 index)
     438             : {
     439          89 :     sal_Int64 aINT64 = sal_False;
     440             : 
     441          89 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     442             :     {
     443          89 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_INT64)
     444             :         {
     445          89 :             aINT64 = readINT64(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     446             :         }
     447             :     }
     448             : 
     449          89 :     return aINT64;
     450             : }
     451             : 
     452           2 : sal_uInt64 ConstantPool::readUINT64Constant(sal_uInt16 index)
     453             : {
     454           2 :     sal_uInt64 aUINT64 = sal_False;
     455             : 
     456           2 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     457             :     {
     458           2 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_UINT64)
     459             :         {
     460           2 :             aUINT64 = readUINT64(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     461             :         }
     462             :     }
     463             : 
     464           2 :     return aUINT64;
     465             : }
     466             : 
     467          60 : float ConstantPool::readFloatConstant(sal_uInt16 index)
     468             : {
     469             :     union
     470             :     {
     471             :         float   v;
     472             :         sal_uInt32  b;
     473          60 :     } x = { 0.0f };
     474             : 
     475          60 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     476             :     {
     477          60 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_FLOAT)
     478             :         {
     479             : #ifdef REGTYPE_IEEE_NATIVE
     480          60 :             x.b = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     481             : #else
     482             : #   error no IEEE
     483             : #endif
     484             :         }
     485             :     }
     486             : 
     487          60 :     return  x.v;
     488             : }
     489             : 
     490           0 : double ConstantPool::readDoubleConstant(sal_uInt16 index)
     491             : {
     492             :     union
     493             :     {
     494             :         double v;
     495             :         struct
     496             :         {
     497             :             sal_uInt32  b1;
     498             :             sal_uInt32  b2;
     499             :         } b;
     500           0 :     } x = { 0.0 };
     501             : 
     502           0 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries))
     503             :     {
     504           0 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_DOUBLE)
     505             :         {
     506             : 
     507             : #ifdef REGTYPE_IEEE_NATIVE
     508             : #   ifdef OSL_BIGENDIAN
     509             :             x.b.b1 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     510             :             x.b.b2 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA + sizeof(sal_uInt32));
     511             : #   else
     512           0 :             x.b.b1 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA + sizeof(sal_uInt32));
     513           0 :             x.b.b2 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     514             : #   endif
     515             : #else
     516             : #   error no IEEE
     517             : #endif
     518             :         }
     519             :     }
     520             : 
     521           0 :     return x.v;
     522             : }
     523             : 
     524           0 : const sal_Unicode* ConstantPool::readStringConstant(sal_uInt16 index)
     525             : {
     526           0 :     const sal_Unicode* aString = NULL_WSTRING;
     527             : 
     528           0 :     if (m_pIndex && (index> 0) && (index <= m_numOfEntries) && m_pStringCache)
     529             :     {
     530           0 :         if (m_pIndex[index - 1] >= 0)
     531             :         {
     532             :             // create cached string now
     533             : 
     534           0 :             if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_CONST_STRING)
     535             :             {
     536           0 :                 m_pIndex[index - 1] = -1 * m_pStringCache->createString(m_pBuffer + m_pIndex[index - 1] + CP_OFFSET_ENTRY_DATA);
     537             :             }
     538             :         }
     539             : 
     540           0 :         aString = m_pStringCache->getString((sal_uInt16) (m_pIndex[index - 1] * -1));
     541             :     }
     542             : 
     543           0 :     return aString;
     544             : }
     545             : 
     546           0 : void ConstantPool::readUIK(sal_uInt16 index, RTUik* uik)
     547             : {
     548           0 :     if (index == 0)
     549             :     {
     550           0 :         uik->m_Data1 = 0;
     551           0 :         uik->m_Data2 = 0;
     552           0 :         uik->m_Data3 = 0;
     553           0 :         uik->m_Data4 = 0;
     554           0 :         uik->m_Data5 = 0;
     555             :     }
     556           0 :     else if (m_pIndex && (index <= m_numOfEntries))
     557             :     {
     558           0 :         if (readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_TAG) == CP_TAG_UIK)
     559             :         {
     560           0 :             uik->m_Data1 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK1);
     561           0 :             uik->m_Data2 = readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK2);
     562           0 :             uik->m_Data3 = readUINT16(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK3);
     563           0 :             uik->m_Data4 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK4);
     564           0 :             uik->m_Data5 = readUINT32(m_pIndex[index - 1] + CP_OFFSET_ENTRY_UIK5);
     565             :         }
     566             :     }
     567           0 : }
     568             : 
     569             : /**************************************************************************
     570             : 
     571             :     class FieldList
     572             : 
     573             : **************************************************************************/
     574             : 
     575      102323 : class FieldList : public BlopObject
     576             : {
     577             : public:
     578             : 
     579             :     sal_uInt16      m_numOfEntries;
     580             :     sal_uInt16      m_numOfFieldEntries;
     581             :     sal_uInt16      m_FIELD_ENTRY_SIZE;
     582             :     ConstantPool*   m_pCP;
     583             : 
     584      102323 :     FieldList(const sal_uInt8* buffer, sal_uInt16 numEntries, ConstantPool* pCP)
     585             :         : BlopObject(buffer, 0, sal_False)
     586             :         , m_numOfEntries(numEntries)
     587      102323 :         , m_pCP(pCP)
     588             :     {
     589      102323 :         if ( m_numOfEntries > 0 )
     590             :         {
     591       24148 :             m_numOfFieldEntries = readUINT16(0);
     592       24148 :             m_FIELD_ENTRY_SIZE = m_numOfFieldEntries * sizeof(sal_uInt16);
     593             :         } else
     594             :         {
     595       78175 :             m_numOfFieldEntries = 0;
     596       78175 :             m_FIELD_ENTRY_SIZE = 0;
     597             :         }
     598      102323 :     }
     599             : 
     600             :     sal_uInt32 parseIndex();
     601             : 
     602             :     const sal_Char* getFieldName(sal_uInt16 index);
     603             :     const sal_Char* getFieldType(sal_uInt16 index);
     604             :     RTFieldAccess getFieldAccess(sal_uInt16 index);
     605             :     RTValueType     getFieldConstValue(sal_uInt16 index, RTConstValueUnion* value);
     606             :         // throws std::bad_alloc
     607             :     const sal_Char* getFieldDoku(sal_uInt16 index);
     608             :     const sal_Char* getFieldFileName(sal_uInt16 index);
     609             : };
     610             : 
     611      102323 : sal_uInt32 FieldList::parseIndex()
     612             : {
     613      102323 :     return ((m_numOfEntries ? sizeof(sal_uInt16) : 0) + (m_numOfEntries * m_FIELD_ENTRY_SIZE));
     614             : }
     615             : 
     616       67329 : const sal_Char* FieldList::getFieldName(sal_uInt16 index)
     617             : {
     618       67329 :     const sal_Char* aName = NULL;
     619             : 
     620       67329 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     621             :     {
     622       67329 :         aName = m_pCP->readUTF8NameConstant(readUINT16(sizeof(sal_uInt16) + (index * m_FIELD_ENTRY_SIZE) + FIELD_OFFSET_NAME));
     623             :     }
     624             : 
     625       67329 :     return aName;
     626             : }
     627             : 
     628       82019 : const sal_Char* FieldList::getFieldType(sal_uInt16 index)
     629             : {
     630       82019 :     const sal_Char* aName = NULL;
     631             : 
     632       82019 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     633             :     {
     634       82019 :         aName = m_pCP->readUTF8NameConstant(readUINT16(sizeof(sal_uInt16) + (index * m_FIELD_ENTRY_SIZE) + FIELD_OFFSET_TYPE));
     635             :     }
     636             : 
     637       82019 :     return aName;
     638             : }
     639             : 
     640       73808 : RTFieldAccess FieldList::getFieldAccess(sal_uInt16 index)
     641             : {
     642       73808 :     RTFieldAccess aAccess = RT_ACCESS_INVALID;
     643             : 
     644       73808 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     645             :     {
     646       73808 :         aAccess = (RTFieldAccess) readUINT16(sizeof(sal_uInt16) + (index * m_FIELD_ENTRY_SIZE) + FIELD_OFFSET_ACCESS);
     647             :     }
     648             : 
     649       73808 :     return aAccess;
     650             : }
     651             : 
     652       30199 : RTValueType FieldList::getFieldConstValue(sal_uInt16 index, RTConstValueUnion* value)
     653             : {
     654       30199 :     RTValueType ret = RT_TYPE_NONE;
     655             : 
     656       30199 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     657             :     {
     658       30199 :         sal_uInt16 cpIndex = readUINT16(sizeof(sal_uInt16) + (index * m_FIELD_ENTRY_SIZE) + FIELD_OFFSET_VALUE);
     659             : 
     660       30199 :         switch (m_pCP->readTag(cpIndex))
     661             :         {
     662             :             case CP_TAG_CONST_BOOL:
     663           0 :                 value->aBool = m_pCP->readBOOLConstant(cpIndex);
     664           0 :                 ret = RT_TYPE_BOOL;
     665           0 :                 break;
     666             :             case CP_TAG_CONST_BYTE:
     667         738 :                 value->aByte = m_pCP->readBYTEConstant(cpIndex);
     668         738 :                 ret = RT_TYPE_BYTE;
     669         738 :                 break;
     670             :             case CP_TAG_CONST_INT16:
     671        6153 :                 value->aShort = m_pCP->readINT16Constant(cpIndex);
     672        6153 :                 ret = RT_TYPE_INT16;
     673        6153 :                 break;
     674             :             case CP_TAG_CONST_UINT16:
     675           2 :                 value->aUShort = m_pCP->readUINT16Constant(cpIndex);
     676           2 :                 ret = RT_TYPE_UINT16;
     677           2 :                 break;
     678             :             case CP_TAG_CONST_INT32:
     679       20255 :                 value->aLong = m_pCP->readINT32Constant(cpIndex);
     680       20255 :                 ret = RT_TYPE_INT32;
     681       20255 :                 break;
     682             :             case CP_TAG_CONST_UINT32:
     683           2 :                 value->aULong = m_pCP->readUINT32Constant(cpIndex);
     684           2 :                 ret = RT_TYPE_UINT32;
     685           2 :                 break;
     686             :             case CP_TAG_CONST_INT64:
     687          89 :               value->aHyper = m_pCP->readINT64Constant(cpIndex);
     688          89 :                 ret = RT_TYPE_INT64;
     689          89 :                 break;
     690             :             case CP_TAG_CONST_UINT64:
     691           2 :               value->aUHyper = m_pCP->readUINT64Constant(cpIndex);
     692           2 :                 ret = RT_TYPE_UINT64;
     693           2 :                 break;
     694             :             case CP_TAG_CONST_FLOAT:
     695          60 :                 value->aFloat = m_pCP->readFloatConstant(cpIndex);
     696          60 :                 ret = RT_TYPE_FLOAT;
     697          60 :                 break;
     698             :             case CP_TAG_CONST_DOUBLE:
     699           0 :                 value->aDouble = m_pCP->readDoubleConstant(cpIndex);
     700           0 :                 ret = RT_TYPE_DOUBLE;
     701           0 :                 break;
     702             :             case CP_TAG_CONST_STRING:
     703           0 :                 value->aString = m_pCP->readStringConstant(cpIndex);
     704           0 :                 ret = RT_TYPE_STRING;
     705           0 :                 break;
     706             :             default:
     707        2898 :                 break;
     708             :         }
     709             :     }
     710             : 
     711       30199 :     return ret;
     712             : }
     713             : 
     714        1622 : const sal_Char* FieldList::getFieldDoku(sal_uInt16 index)
     715             : {
     716        1622 :     const sal_Char* aDoku = NULL;
     717             : 
     718        1622 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     719             :     {
     720        1622 :         aDoku = m_pCP->readUTF8NameConstant(readUINT16(sizeof(sal_uInt16) + (index * m_FIELD_ENTRY_SIZE) + FIELD_OFFSET_DOKU));
     721             :     }
     722             : 
     723        1622 :     return aDoku;
     724             : }
     725             : 
     726           0 : const sal_Char* FieldList::getFieldFileName(sal_uInt16 index)
     727             : {
     728           0 :     const sal_Char* aFileName = NULL;
     729             : 
     730           0 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     731             :     {
     732           0 :         aFileName = m_pCP->readUTF8NameConstant(readUINT16(sizeof(sal_uInt16) + (index * m_FIELD_ENTRY_SIZE) + FIELD_OFFSET_FILENAME));
     733             :     }
     734             : 
     735           0 :     return aFileName;
     736             : }
     737             : 
     738             : /**************************************************************************
     739             : 
     740             :     class ReferenceList
     741             : 
     742             : **************************************************************************/
     743             : 
     744      102323 : class ReferenceList : public BlopObject
     745             : {
     746             : public:
     747             : 
     748             :     sal_uInt16      m_numOfEntries;
     749             :     sal_uInt16      m_numOfReferenceEntries;
     750             :     sal_uInt16      m_REFERENCE_ENTRY_SIZE;
     751             :     ConstantPool*   m_pCP;
     752             : 
     753      102323 :     ReferenceList(const sal_uInt8* buffer, sal_uInt16 numEntries, ConstantPool* pCP)
     754             :         : BlopObject(buffer, 0, sal_False)
     755             :         , m_numOfEntries(numEntries)
     756      102323 :         , m_pCP(pCP)
     757             :     {
     758      102323 :         if ( m_numOfEntries > 0 )
     759             :         {
     760        5591 :             m_numOfReferenceEntries = readUINT16(0);
     761        5591 :             m_REFERENCE_ENTRY_SIZE = m_numOfReferenceEntries * sizeof(sal_uInt16);
     762             :         } else
     763             :         {
     764       96732 :             m_numOfReferenceEntries = 0;
     765       96732 :             m_REFERENCE_ENTRY_SIZE = 0;
     766             :         }
     767      102323 :     }
     768             : 
     769             :     sal_uInt32 parseIndex();
     770             : 
     771             :     const sal_Char* getReferenceName(sal_uInt16 index);
     772             :     RTReferenceType getReferenceType(sal_uInt16 index);
     773             :     const sal_Char* getReferenceDoku(sal_uInt16 index);
     774             :     RTFieldAccess   getReferenceAccess(sal_uInt16 index);
     775             : };
     776             : 
     777      102323 : sal_uInt32 ReferenceList::parseIndex()
     778             : {
     779      102323 :     return ((m_numOfEntries ? sizeof(sal_uInt16) : 0) + (m_numOfEntries * m_REFERENCE_ENTRY_SIZE));
     780             : }
     781             : 
     782        6227 : const sal_Char* ReferenceList::getReferenceName(sal_uInt16 index)
     783             : {
     784        6227 :     const sal_Char* aName = NULL;
     785             : 
     786        6227 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     787             :     {
     788        6227 :         aName = m_pCP->readUTF8NameConstant(readUINT16(sizeof(sal_uInt16) + (index * m_REFERENCE_ENTRY_SIZE) + REFERENCE_OFFSET_NAME));
     789             :     }
     790             : 
     791        6227 :     return aName;
     792             : }
     793             : 
     794        5820 : RTReferenceType ReferenceList::getReferenceType(sal_uInt16 index)
     795             : {
     796        5820 :     RTReferenceType refType = RT_REF_INVALID;
     797             : 
     798        5820 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     799             :     {
     800        5820 :         refType = (RTReferenceType) readUINT16(sizeof(sal_uInt16) + (index * m_REFERENCE_ENTRY_SIZE) + REFERENCE_OFFSET_TYPE);
     801             :     }
     802             : 
     803        5820 :     return refType;
     804             : }
     805             : 
     806           0 : const sal_Char* ReferenceList::getReferenceDoku(sal_uInt16 index)
     807             : {
     808           0 :     const sal_Char* aDoku = NULL;
     809             : 
     810           0 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     811             :     {
     812           0 :         aDoku = m_pCP->readUTF8NameConstant(readUINT16(sizeof(sal_uInt16) + (index * m_REFERENCE_ENTRY_SIZE) + REFERENCE_OFFSET_DOKU));
     813             :     }
     814             : 
     815           0 :     return aDoku;
     816             : }
     817             : 
     818         199 : RTFieldAccess ReferenceList::getReferenceAccess(sal_uInt16 index)
     819             : {
     820         199 :     RTFieldAccess aAccess = RT_ACCESS_INVALID;
     821             : 
     822         199 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     823             :     {
     824         199 :         aAccess = (RTFieldAccess) readUINT16(sizeof(sal_uInt16) + (index * m_REFERENCE_ENTRY_SIZE) + REFERENCE_OFFSET_ACCESS);
     825             :     }
     826             : 
     827         199 :     return aAccess;
     828             : }
     829             : 
     830             : /**************************************************************************
     831             : 
     832             :     class MethodList
     833             : 
     834             : **************************************************************************/
     835             : 
     836             : class MethodList : public BlopObject
     837             : {
     838             : public:
     839             : 
     840             :     sal_uInt16      m_numOfEntries;
     841             :     sal_uInt16      m_numOfMethodEntries;
     842             :     sal_uInt16      m_numOfParamEntries;
     843             :     sal_uInt16      m_PARAM_ENTRY_SIZE;
     844             :     sal_uInt32*     m_pIndex;
     845             :     ConstantPool*   m_pCP;
     846             : 
     847      102323 :     MethodList(const sal_uInt8* buffer, sal_uInt16 numEntries, ConstantPool* pCP)
     848             :         : BlopObject(buffer, 0, sal_False)
     849             :         , m_numOfEntries(numEntries)
     850             :         , m_pIndex(NULL)
     851      102323 :         , m_pCP(pCP)
     852             :     {
     853      102323 :         if ( m_numOfEntries > 0 )
     854             :         {
     855       29024 :             m_numOfMethodEntries = readUINT16(0);
     856       29024 :             m_numOfParamEntries = readUINT16(sizeof(sal_uInt16));
     857       29024 :             m_PARAM_ENTRY_SIZE = m_numOfParamEntries * sizeof(sal_uInt16);
     858             :         } else
     859             :         {
     860       73299 :             m_numOfMethodEntries = 0;
     861       73299 :             m_numOfParamEntries = 0;
     862       73299 :             m_PARAM_ENTRY_SIZE = 0;
     863             :         }
     864      102323 :     }
     865             : 
     866             :     ~MethodList();
     867             : 
     868             :     sal_uInt32 parseIndex(); // throws std::bad_alloc
     869             : 
     870             :     const sal_Char* getMethodName(sal_uInt16 index);
     871             :     sal_uInt16      getMethodParamCount(sal_uInt16 index);
     872             :     const sal_Char* getMethodParamType(sal_uInt16 index, sal_uInt16 paramIndex);
     873             :     const sal_Char* getMethodParamName(sal_uInt16 index, sal_uInt16 paramIndex);
     874             :     RTParamMode     getMethodParamMode(sal_uInt16 index, sal_uInt16 paramIndex);
     875             :     sal_uInt16      getMethodExcCount(sal_uInt16 index);
     876             :     const sal_Char* getMethodExcType(sal_uInt16 index, sal_uInt16 excIndex);
     877             :     const sal_Char* getMethodReturnType(sal_uInt16 index);
     878             :     RTMethodMode    getMethodMode(sal_uInt16 index);
     879             :     const sal_Char* getMethodDoku(sal_uInt16 index);
     880             : 
     881             : private:
     882             :     sal_uInt16 calcMethodParamIndex( const sal_uInt16 index );
     883             : };
     884             : 
     885      204646 : MethodList::~MethodList()
     886             : {
     887      102323 :     if (m_pIndex) delete[] m_pIndex;
     888      102323 : }
     889             : 
     890      168359 : sal_uInt16 MethodList::calcMethodParamIndex( const sal_uInt16 index )
     891             : {
     892      168359 :     return (METHOD_OFFSET_PARAM_COUNT + sizeof(sal_uInt16) + (index * m_PARAM_ENTRY_SIZE));
     893             : }
     894             : 
     895      102323 : sal_uInt32 MethodList::parseIndex()
     896             : {
     897      102323 :     if (m_pIndex)
     898             :     {
     899           0 :         delete[] m_pIndex;
     900           0 :         m_pIndex = NULL;
     901             :     }
     902             : 
     903      102323 :     sal_uInt32 offset = 0;
     904             : 
     905      102323 :     if (m_numOfEntries)
     906             :     {
     907       29024 :         offset = 2 * sizeof(sal_uInt16);
     908       29024 :         m_pIndex = new sal_uInt32[m_numOfEntries];
     909             : 
     910      141153 :         for (int i = 0; i < m_numOfEntries; i++)
     911             :         {
     912      112129 :             m_pIndex[i] = offset;
     913             : 
     914      112129 :             offset += readUINT16(offset);
     915             :         }
     916             :     }
     917             : 
     918      102323 :     return offset;
     919             : }
     920             : 
     921       67819 : const sal_Char* MethodList::getMethodName(sal_uInt16 index)
     922             : {
     923       67819 :     const sal_Char* aName = NULL;
     924             : 
     925       67819 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     926             :     {
     927       67819 :         aName = m_pCP->readUTF8NameConstant(readUINT16(m_pIndex[index] + METHOD_OFFSET_NAME));
     928             :     }
     929             : 
     930       67819 :     return aName;
     931             : }
     932             : 
     933       66159 : sal_uInt16 MethodList::getMethodParamCount(sal_uInt16 index)
     934             : {
     935       66159 :     sal_uInt16 aCount = 0;
     936             : 
     937       66159 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
     938             :     {
     939       66159 :         aCount = readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT);
     940             :     }
     941             : 
     942       66159 :     return aCount;
     943             : }
     944             : 
     945       47937 : const sal_Char* MethodList::getMethodParamType(sal_uInt16 index, sal_uInt16 paramIndex)
     946             : {
     947       47937 :     const sal_Char* aName = NULL;
     948             : 
     949       95874 :     if ((m_numOfEntries > 0) &&
     950             :         (index <= m_numOfEntries) &&
     951       47937 :         (paramIndex <= readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT)))
     952             :     {
     953             :         aName = m_pCP->readUTF8NameConstant(
     954             :             readUINT16(
     955       47937 :                 m_pIndex[index] +
     956       47937 :                 calcMethodParamIndex(paramIndex) +
     957       47937 :                 PARAM_OFFSET_TYPE));
     958             :     }
     959             : 
     960       47937 :     return aName;
     961             : }
     962             : 
     963       21922 : const sal_Char* MethodList::getMethodParamName(sal_uInt16 index, sal_uInt16 paramIndex)
     964             : {
     965       21922 :     const sal_Char* aName = NULL;
     966             : 
     967       43844 :     if ((m_numOfEntries > 0) &&
     968             :         (index <= m_numOfEntries) &&
     969       21922 :         (paramIndex <= readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT)))
     970             :     {
     971             :         aName = m_pCP->readUTF8NameConstant(
     972             :             readUINT16(
     973       21922 :                 m_pIndex[index] +
     974       21922 :                 calcMethodParamIndex(paramIndex) +
     975       21922 :                 PARAM_OFFSET_NAME));
     976             :     }
     977             : 
     978       21922 :     return aName;
     979             : }
     980             : 
     981       41160 : RTParamMode MethodList::getMethodParamMode(sal_uInt16 index, sal_uInt16 paramIndex)
     982             : {
     983       41160 :     RTParamMode aMode = RT_PARAM_INVALID;
     984             : 
     985       82320 :     if ((m_numOfEntries > 0) &&
     986             :         (index <= m_numOfEntries) &&
     987       41160 :         (paramIndex <= readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT)))
     988             :     {
     989             :         aMode = (RTParamMode) readUINT16(
     990       41160 :                 m_pIndex[index] +
     991       41160 :                 calcMethodParamIndex(paramIndex) +
     992       41160 :                 PARAM_OFFSET_MODE);
     993             :     }
     994             : 
     995       41160 :     return aMode;
     996             : }
     997             : 
     998       40520 : sal_uInt16 MethodList::getMethodExcCount(sal_uInt16 index)
     999             : {
    1000       40520 :     sal_uInt16 aCount = 0;
    1001             : 
    1002       40520 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
    1003             :     {
    1004       40520 :         aCount = readUINT16(m_pIndex[index] + calcMethodParamIndex(readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT)));
    1005             :     }
    1006             : 
    1007       40520 :     return aCount;
    1008             : }
    1009             : 
    1010       16820 : const sal_Char* MethodList::getMethodExcType(sal_uInt16 index, sal_uInt16 excIndex)
    1011             : {
    1012       16820 :     const sal_Char* aName = NULL;
    1013             : 
    1014       16820 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
    1015             :     {
    1016       16820 :         sal_uInt32 excOffset = m_pIndex[index] + calcMethodParamIndex(readUINT16(m_pIndex[index] + METHOD_OFFSET_PARAM_COUNT));
    1017             : 
    1018       16820 :         if (excIndex <= readUINT16(excOffset))
    1019             :         {
    1020             :             aName = m_pCP->readUTF8NameConstant(
    1021             :                 readUINT16(
    1022             :                     excOffset +
    1023             :                     sizeof(sal_uInt16) +
    1024       16820 :                     (excIndex * sizeof(sal_uInt16))));
    1025             :         }
    1026             :     }
    1027             : 
    1028       16820 :     return aName;
    1029             : }
    1030             : 
    1031       54140 : const sal_Char* MethodList::getMethodReturnType(sal_uInt16 index)
    1032             : {
    1033       54140 :     const sal_Char* aName = NULL;
    1034             : 
    1035       54140 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
    1036             :     {
    1037       54140 :         aName = m_pCP->readUTF8NameConstant(readUINT16(m_pIndex[index] + METHOD_OFFSET_RETURN));
    1038             :     }
    1039             : 
    1040       54140 :     return aName;
    1041             : }
    1042             : 
    1043      115908 : RTMethodMode MethodList::getMethodMode(sal_uInt16 index)
    1044             : {
    1045      115908 :     RTMethodMode aMode = RT_MODE_INVALID;
    1046             : 
    1047      115908 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
    1048             :     {
    1049      115908 :         aMode = (RTMethodMode) readUINT16(m_pIndex[index] + METHOD_OFFSET_MODE);
    1050             :     }
    1051             : 
    1052      115908 :     return aMode;
    1053             : }
    1054             : 
    1055       11711 : const sal_Char* MethodList::getMethodDoku(sal_uInt16 index)
    1056             : {
    1057       11711 :     const sal_Char* aDoku = NULL;
    1058             : 
    1059       11711 :     if ((m_numOfEntries > 0) && (index <= m_numOfEntries))
    1060             :     {
    1061       11711 :         aDoku = m_pCP->readUTF8NameConstant(readUINT16(m_pIndex[index] + METHOD_OFFSET_DOKU));
    1062             :     }
    1063             : 
    1064       11711 :     return aDoku;
    1065             : }
    1066             : 
    1067             : /**************************************************************************
    1068             : 
    1069             :     class TypeRegistryEntry
    1070             : 
    1071             : **************************************************************************/
    1072             : 
    1073             : class TypeRegistryEntry: public BlopObject {
    1074             : public:
    1075             :     ConstantPool*   m_pCP;
    1076             :     FieldList*      m_pFields;
    1077             :     MethodList*     m_pMethods;
    1078             :     ReferenceList*  m_pReferences;
    1079             :     sal_uInt32      m_refCount;
    1080             :     sal_uInt16      m_nSuperTypes;
    1081             :     sal_uInt16      m_offset_SUPERTYPES;
    1082             : 
    1083             :     TypeRegistryEntry(
    1084             :         const sal_uInt8* buffer, sal_uInt32 len, sal_Bool copyBuffer);
    1085             :         // throws std::bad_alloc
    1086             : 
    1087             :     ~TypeRegistryEntry();
    1088             : 
    1089             :     typereg_Version getVersion() const;
    1090             : };
    1091             : 
    1092      102323 : TypeRegistryEntry::TypeRegistryEntry(
    1093             :     const sal_uInt8* buffer, sal_uInt32 len, sal_Bool copyBuffer):
    1094             :     BlopObject(buffer, len, copyBuffer), m_pCP(NULL), m_pFields(NULL),
    1095             :     m_pMethods(NULL), m_pReferences(NULL), m_refCount(1), m_nSuperTypes(0),
    1096      102323 :     m_offset_SUPERTYPES(0)
    1097             : {
    1098      102323 :     std::size_t const entrySize = sizeof(sal_uInt16);
    1099      102323 :     sal_uInt16 nHeaderEntries = readUINT16(OFFSET_N_ENTRIES);
    1100      102323 :     sal_uInt16 offset_N_SUPERTYPES = OFFSET_N_ENTRIES + entrySize + (nHeaderEntries * entrySize);
    1101      102323 :     m_offset_SUPERTYPES = offset_N_SUPERTYPES + entrySize;
    1102      102323 :     m_nSuperTypes = readUINT16(offset_N_SUPERTYPES);
    1103             : 
    1104      102323 :     sal_uInt16 offset_CP_SIZE = m_offset_SUPERTYPES + (m_nSuperTypes * entrySize);
    1105      102323 :     sal_uInt16 offset_CP = offset_CP_SIZE + entrySize;
    1106             : 
    1107      102323 :     m_pCP = new ConstantPool(m_pBuffer + offset_CP, readUINT16(offset_CP_SIZE));
    1108             : 
    1109      102323 :     sal_uInt32 offset = offset_CP + m_pCP->parseIndex();
    1110             : 
    1111             :     m_pFields = new FieldList(
    1112      102323 :         m_pBuffer + offset + entrySize, readUINT16(offset), m_pCP);
    1113             : 
    1114      102323 :     offset += sizeof(sal_uInt16) + m_pFields->parseIndex();
    1115             : 
    1116             :     m_pMethods = new MethodList(
    1117      102323 :         m_pBuffer + offset + entrySize, readUINT16(offset), m_pCP);
    1118             : 
    1119      102323 :     offset += sizeof(sal_uInt16) + m_pMethods->parseIndex();
    1120             : 
    1121             :     m_pReferences = new ReferenceList(
    1122      102323 :         m_pBuffer + offset + entrySize, readUINT16(offset), m_pCP);
    1123             : 
    1124      102323 :     m_pReferences->parseIndex();
    1125      102323 : }
    1126             : 
    1127      204646 : TypeRegistryEntry::~TypeRegistryEntry()
    1128             : {
    1129      102323 :     delete m_pCP;
    1130      102323 :     delete m_pFields;
    1131      102323 :     delete m_pMethods;
    1132      102323 :     delete m_pReferences;
    1133      102323 : }
    1134             : 
    1135      102323 : typereg_Version TypeRegistryEntry::getVersion() const {
    1136             :     // Assumes two's complement arithmetic with modulo-semantics:
    1137      102323 :     return static_cast< typereg_Version >(readUINT32(OFFSET_MAGIC) - magic);
    1138             : }
    1139             : 
    1140             : /**************************************************************************
    1141             : 
    1142             :     C-API
    1143             : 
    1144             : **************************************************************************/
    1145             : 
    1146             : extern "C" {
    1147             : 
    1148      102323 : REG_DLLPUBLIC sal_Bool TYPEREG_CALLTYPE typereg_reader_create(
    1149             :     void const * buffer, sal_uInt32 length, sal_Bool copy,
    1150             :     typereg_Version maxVersion, void ** result)
    1151             :     SAL_THROW_EXTERN_C()
    1152             : {
    1153      102323 :     if (length < OFFSET_CP || length > SAL_MAX_UINT32) {
    1154           0 :         *result = 0;
    1155           0 :         return true;
    1156             :     }
    1157      102323 :     std::auto_ptr< TypeRegistryEntry > entry;
    1158             :     try {
    1159             :         entry.reset(
    1160             :             new TypeRegistryEntry(
    1161             :                 static_cast< sal_uInt8 const * >(buffer),
    1162      102323 :                 static_cast< sal_uInt32 >(length), copy));
    1163           0 :     } catch (std::bad_alloc &) {
    1164           0 :         return false;
    1165             :     }
    1166      102323 :     if (entry->readUINT32(OFFSET_SIZE) != length) {
    1167           0 :         *result = 0;
    1168           0 :         return true;
    1169             :     }
    1170      102323 :     typereg_Version version = entry->getVersion();
    1171      102323 :     if (version < TYPEREG_VERSION_0 || version > maxVersion) {
    1172           0 :         *result = 0;
    1173           0 :         return true;
    1174             :     }
    1175      102323 :     *result = entry.release();
    1176      102323 :     return true;
    1177             : }
    1178             : 
    1179       40828 : static TypeReaderImpl TYPEREG_CALLTYPE createEntry(const sal_uInt8* buffer, sal_uInt32 len, sal_Bool copyBuffer)
    1180             : {
    1181             :     void * handle;
    1182       40828 :     typereg_reader_create(buffer, len, copyBuffer, TYPEREG_VERSION_1, &handle);
    1183       40828 :     return handle;
    1184             : }
    1185             : 
    1186       54012 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_acquire(void * hEntry) SAL_THROW_EXTERN_C()
    1187             : {
    1188       54012 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1189             : 
    1190       54012 :     if (pEntry != NULL)
    1191       53271 :         pEntry->m_refCount++;
    1192       54012 : }
    1193             : 
    1194      333532 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_release(void * hEntry) SAL_THROW_EXTERN_C()
    1195             : {
    1196      333532 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1197             : 
    1198      333532 :     if (pEntry != NULL)
    1199             :     {
    1200      155594 :         if (--pEntry->m_refCount == 0)
    1201      102323 :             delete pEntry;
    1202             :     }
    1203      333532 : }
    1204             : 
    1205           0 : REG_DLLPUBLIC typereg_Version TYPEREG_CALLTYPE typereg_reader_getVersion(void * handle) SAL_THROW_EXTERN_C() {
    1206             :     return handle == 0
    1207             :         ? TYPEREG_VERSION_0
    1208           0 :         : static_cast< TypeRegistryEntry * >(handle)->getVersion();
    1209             : }
    1210             : 
    1211           0 : static sal_uInt16 TYPEREG_CALLTYPE getMinorVersion(TypeReaderImpl hEntry)
    1212             : {
    1213           0 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1214             : 
    1215           0 :     if (pEntry == NULL) return 0;
    1216             : 
    1217           0 :     return pEntry->readUINT16(OFFSET_MINOR_VERSION);
    1218             : }
    1219             : 
    1220           0 : static sal_uInt16 TYPEREG_CALLTYPE getMajorVersion(TypeReaderImpl hEntry)
    1221             : {
    1222           0 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1223             : 
    1224           0 :     if (pEntry == NULL) return 0;
    1225             : 
    1226           0 :     return pEntry->readUINT16(OFFSET_MAJOR_VERSION);
    1227             : }
    1228             : 
    1229      151533 : REG_DLLPUBLIC RTTypeClass TYPEREG_CALLTYPE typereg_reader_getTypeClass(void * hEntry) SAL_THROW_EXTERN_C()
    1230             : {
    1231      151533 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1232             : 
    1233      151533 :     if (pEntry == NULL) return RT_TYPE_INVALID;
    1234             : 
    1235             :     return (RTTypeClass)
    1236      151533 :         (pEntry->readUINT16(OFFSET_TYPE_CLASS) & ~RT_TYPE_PUBLISHED);
    1237             : }
    1238             : 
    1239        4165 : REG_DLLPUBLIC sal_Bool TYPEREG_CALLTYPE typereg_reader_isPublished(void * hEntry) SAL_THROW_EXTERN_C()
    1240             : {
    1241        4165 :     TypeRegistryEntry * entry = static_cast< TypeRegistryEntry * >(hEntry);
    1242             :     return entry != 0
    1243        4165 :         && (entry->readUINT16(OFFSET_TYPE_CLASS) & RT_TYPE_PUBLISHED) != 0;
    1244             : }
    1245             : 
    1246       10717 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getTypeName(void * hEntry, rtl_uString** pTypeName)
    1247             :     SAL_THROW_EXTERN_C()
    1248             : {
    1249       10717 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1250             : 
    1251       10717 :     if (pEntry == NULL)
    1252             :     {
    1253           0 :         rtl_uString_new(pTypeName);
    1254       10717 :         return;
    1255             :     }
    1256             : 
    1257       10717 :     const sal_Char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(OFFSET_THIS_TYPE));
    1258             :     rtl_string2UString(
    1259             :         pTypeName, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1260       10717 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1261             : }
    1262             : 
    1263             : 
    1264           0 : static void TYPEREG_CALLTYPE getSuperTypeName(TypeReaderImpl hEntry, rtl_uString** pSuperTypeName)
    1265             : {
    1266           0 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1267             : 
    1268           0 :     if (pEntry == NULL)
    1269             :     {
    1270           0 :         rtl_uString_new(pSuperTypeName);
    1271           0 :         return;
    1272             :     }
    1273             : 
    1274           0 :     if (pEntry->m_nSuperTypes == 0)
    1275             :     {
    1276           0 :         rtl_uString_new(pSuperTypeName);
    1277           0 :         return;
    1278             :     }
    1279             : 
    1280           0 :     const sal_Char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(pEntry->m_offset_SUPERTYPES )); //+ (index * sizeof(sal_uInt16))));
    1281             :     rtl_string2UString(
    1282             :         pSuperTypeName, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1283           0 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1284             : }
    1285             : 
    1286           0 : static void TYPEREG_CALLTYPE getUik(TypeReaderImpl hEntry, RTUik* uik)
    1287             : {
    1288           0 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1289             : 
    1290           0 :     if (pEntry != NULL)
    1291             :     {
    1292           0 :         pEntry->m_pCP->readUIK(pEntry->readUINT16(OFFSET_UIK), uik);
    1293             :     }
    1294           0 : }
    1295             : 
    1296        3731 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getDocumentation(void * hEntry, rtl_uString** pDoku)
    1297             :     SAL_THROW_EXTERN_C()
    1298             : {
    1299        3731 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1300             : 
    1301        3731 :     if (pEntry == NULL)
    1302             :     {
    1303           0 :         rtl_uString_new(pDoku);
    1304        3731 :         return;
    1305             :     }
    1306             : 
    1307        3731 :     const sal_Char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(OFFSET_DOKU));
    1308             :     rtl_string2UString(
    1309             :         pDoku, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1310        3731 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1311             : }
    1312             : 
    1313           0 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getFileName(void * hEntry, rtl_uString** pFileName)
    1314             :     SAL_THROW_EXTERN_C()
    1315             : {
    1316           0 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1317             : 
    1318           0 :     if (pEntry == NULL)
    1319             :     {
    1320           0 :         rtl_uString_new(pFileName);
    1321           0 :         return;
    1322             :     }
    1323             : 
    1324           0 :     const sal_Char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(OFFSET_FILENAME));
    1325             :     rtl_string2UString(
    1326             :         pFileName, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1327           0 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1328             : }
    1329             : 
    1330             : 
    1331      112213 : REG_DLLPUBLIC sal_uInt16 TYPEREG_CALLTYPE typereg_reader_getFieldCount(void * hEntry) SAL_THROW_EXTERN_C()
    1332             : {
    1333      112213 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1334             : 
    1335      112213 :     if (pEntry == NULL) return 0;
    1336             : 
    1337      112213 :     return pEntry->m_pFields->m_numOfEntries;
    1338             : }
    1339             : 
    1340       40820 : static sal_uInt32 TYPEREG_CALLTYPE getFieldCount(TypeReaderImpl hEntry)
    1341             : {
    1342       40820 :     return typereg_reader_getFieldCount(hEntry);
    1343             : }
    1344             : 
    1345       67329 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getFieldName(void * hEntry, rtl_uString** pFieldName, sal_uInt16 index)
    1346             :     SAL_THROW_EXTERN_C()
    1347             : {
    1348       67329 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1349             : 
    1350       67329 :     if (pEntry == NULL)
    1351             :     {
    1352           0 :         rtl_uString_new(pFieldName);
    1353       67329 :         return;
    1354             :     }
    1355       67329 :     const sal_Char* pTmp = pEntry->m_pFields->getFieldName(index);
    1356             :     rtl_string2UString(
    1357             :         pFieldName, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1358       67329 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1359             : }
    1360             : 
    1361       82019 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getFieldTypeName(void * hEntry, rtl_uString** pFieldType, sal_uInt16 index)
    1362             :     SAL_THROW_EXTERN_C()
    1363             : {
    1364       82019 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1365             : 
    1366       82019 :     if (pEntry == NULL)
    1367             :     {
    1368           0 :         rtl_uString_new(pFieldType);
    1369       82019 :         return;
    1370             :     }
    1371             : 
    1372       82019 :     const sal_Char* pTmp = pEntry->m_pFields->getFieldType(index);
    1373             :     rtl_string2UString(
    1374             :         pFieldType, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1375       82019 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1376             : }
    1377             : 
    1378       73808 : REG_DLLPUBLIC RTFieldAccess TYPEREG_CALLTYPE typereg_reader_getFieldFlags(void * hEntry, sal_uInt16 index)
    1379             :     SAL_THROW_EXTERN_C()
    1380             : {
    1381       73808 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1382             : 
    1383       73808 :     if (pEntry == NULL) return RT_ACCESS_INVALID;
    1384             : 
    1385       73808 :     return pEntry->m_pFields->getFieldAccess(index);
    1386             : }
    1387             : 
    1388       30199 : REG_DLLPUBLIC sal_Bool TYPEREG_CALLTYPE typereg_reader_getFieldValue(
    1389             :     void * hEntry, sal_uInt16 index, RTValueType * type,
    1390             :     RTConstValueUnion * value)
    1391             :     SAL_THROW_EXTERN_C()
    1392             : {
    1393       30199 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1394             : 
    1395       30199 :     if (pEntry == NULL) {
    1396           0 :         *type = RT_TYPE_NONE;
    1397           0 :         return true;
    1398             :     }
    1399             : 
    1400             :     try {
    1401       30199 :         *type = pEntry->m_pFields->getFieldConstValue(index, value);
    1402           0 :     } catch (std::bad_alloc &) {
    1403           0 :         return false;
    1404             :     }
    1405       30199 :     return true;
    1406             : }
    1407             : 
    1408           0 : static RTValueType TYPEREG_CALLTYPE getFieldConstValue(TypeReaderImpl hEntry, sal_uInt16 index, RTConstValueUnion* value)
    1409             : {
    1410           0 :     RTValueType t = RT_TYPE_NONE;
    1411           0 :     typereg_reader_getFieldValue(hEntry, index, &t, value);
    1412           0 :     return t;
    1413             : }
    1414             : 
    1415        1622 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getFieldDocumentation(void * hEntry, rtl_uString** pDoku, sal_uInt16 index)
    1416             :     SAL_THROW_EXTERN_C()
    1417             : {
    1418        1622 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1419             : 
    1420        1622 :     if (pEntry == NULL)
    1421             :     {
    1422           0 :         rtl_uString_new(pDoku);
    1423        1622 :         return;
    1424             :     }
    1425             : 
    1426        1622 :     const sal_Char* pTmp = pEntry->m_pFields->getFieldDoku(index);
    1427             :     rtl_string2UString(
    1428             :         pDoku, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1429        1622 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1430             : }
    1431             : 
    1432           0 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getFieldFileName(void * hEntry, rtl_uString** pFieldFileName, sal_uInt16 index)
    1433             :     SAL_THROW_EXTERN_C()
    1434             : {
    1435           0 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1436             : 
    1437           0 :     if (pEntry == NULL)
    1438             :     {
    1439           0 :         rtl_uString_new(pFieldFileName);
    1440           0 :         return;
    1441             :     }
    1442             : 
    1443           0 :     const sal_Char* pTmp = pEntry->m_pFields->getFieldFileName(index);
    1444             :     rtl_string2UString(
    1445             :         pFieldFileName, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1446           0 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1447             : }
    1448             : 
    1449             : 
    1450       68151 : REG_DLLPUBLIC sal_uInt16 TYPEREG_CALLTYPE typereg_reader_getMethodCount(void * hEntry) SAL_THROW_EXTERN_C()
    1451             : {
    1452       68151 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1453             : 
    1454       68151 :     if (pEntry == NULL) return 0;
    1455             : 
    1456       68151 :     return pEntry->m_pMethods->m_numOfEntries;
    1457             : }
    1458             : 
    1459           0 : static sal_uInt32 TYPEREG_CALLTYPE getMethodCount(TypeReaderImpl hEntry)
    1460             : {
    1461           0 :     return typereg_reader_getMethodCount(hEntry);
    1462             : }
    1463             : 
    1464       67819 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getMethodName(void * hEntry, rtl_uString** pMethodName, sal_uInt16 index)
    1465             :     SAL_THROW_EXTERN_C()
    1466             : {
    1467       67819 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1468             : 
    1469       67819 :     if (pEntry == NULL)
    1470             :     {
    1471           0 :         rtl_uString_new(pMethodName);
    1472       67819 :         return;
    1473             :     }
    1474             : 
    1475       67819 :     const sal_Char* pTmp = pEntry->m_pMethods->getMethodName(index);
    1476             :     rtl_string2UString(
    1477             :         pMethodName, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1478       67819 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1479             : }
    1480             : 
    1481       66159 : REG_DLLPUBLIC sal_uInt16 TYPEREG_CALLTYPE typereg_reader_getMethodParameterCount(
    1482             :     void * hEntry, sal_uInt16 index) SAL_THROW_EXTERN_C()
    1483             : {
    1484       66159 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1485             : 
    1486       66159 :     if (pEntry == NULL) return 0;
    1487             : 
    1488       66159 :     return pEntry->m_pMethods->getMethodParamCount(index);
    1489             : }
    1490             : 
    1491           0 : static sal_uInt32 TYPEREG_CALLTYPE getMethodParamCount(TypeReaderImpl hEntry, sal_uInt16 index)
    1492             : {
    1493           0 :     return typereg_reader_getMethodParameterCount(hEntry, index);
    1494             : }
    1495             : 
    1496       47937 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getMethodParameterTypeName(void * hEntry, rtl_uString** pMethodParamType, sal_uInt16 index, sal_uInt16 paramIndex)
    1497             :     SAL_THROW_EXTERN_C()
    1498             : {
    1499       47937 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1500             : 
    1501       47937 :     if (pEntry == NULL)
    1502             :     {
    1503           0 :         rtl_uString_new(pMethodParamType);
    1504       47937 :         return;
    1505             :     }
    1506             : 
    1507       47937 :     const sal_Char* pTmp = pEntry->m_pMethods->getMethodParamType(index, paramIndex);
    1508             :     rtl_string2UString(
    1509             :         pMethodParamType, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1510       47937 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1511             : }
    1512             : 
    1513       21922 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getMethodParameterName(void * hEntry, rtl_uString** pMethodParamName, sal_uInt16 index, sal_uInt16 paramIndex)
    1514             :     SAL_THROW_EXTERN_C()
    1515             : {
    1516       21922 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1517             : 
    1518       21922 :     if (pEntry == NULL)
    1519             :     {
    1520           0 :         rtl_uString_new(pMethodParamName);
    1521       21922 :         return;
    1522             :     }
    1523             : 
    1524       21922 :     const sal_Char* pTmp = pEntry->m_pMethods->getMethodParamName(index, paramIndex);
    1525             :     rtl_string2UString(
    1526             :         pMethodParamName, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1527       21922 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1528             : }
    1529             : 
    1530       41160 : REG_DLLPUBLIC RTParamMode TYPEREG_CALLTYPE typereg_reader_getMethodParameterFlags(void * hEntry, sal_uInt16 index, sal_uInt16 paramIndex)
    1531             :     SAL_THROW_EXTERN_C()
    1532             : {
    1533       41160 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1534             : 
    1535       41160 :     if (pEntry == NULL) return RT_PARAM_INVALID;
    1536             : 
    1537       41160 :     return pEntry->m_pMethods->getMethodParamMode(index, paramIndex);
    1538             : }
    1539             : 
    1540       40520 : REG_DLLPUBLIC sal_uInt16 TYPEREG_CALLTYPE typereg_reader_getMethodExceptionCount(
    1541             :     void * hEntry, sal_uInt16 index) SAL_THROW_EXTERN_C()
    1542             : {
    1543       40520 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1544             : 
    1545       40520 :     if (pEntry == NULL) return 0;
    1546             : 
    1547       40520 :     return pEntry->m_pMethods->getMethodExcCount(index);
    1548             : }
    1549             : 
    1550           0 : static sal_uInt32 TYPEREG_CALLTYPE getMethodExcCount(TypeReaderImpl hEntry, sal_uInt16 index)
    1551             : {
    1552           0 :     return typereg_reader_getMethodExceptionCount(hEntry, index);
    1553             : }
    1554             : 
    1555       16820 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getMethodExceptionTypeName(void * hEntry, rtl_uString** pMethodExcpType, sal_uInt16 index, sal_uInt16 excIndex)
    1556             :     SAL_THROW_EXTERN_C()
    1557             : {
    1558       16820 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1559             : 
    1560       16820 :     if (pEntry == NULL)
    1561             :     {
    1562           0 :         rtl_uString_new(pMethodExcpType);
    1563       16820 :         return;
    1564             :     }
    1565             : 
    1566       16820 :     const sal_Char* pTmp = pEntry->m_pMethods->getMethodExcType(index, excIndex);
    1567             :     rtl_string2UString(
    1568             :         pMethodExcpType, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1569       16820 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1570             : }
    1571             : 
    1572       54140 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getMethodReturnTypeName(void * hEntry, rtl_uString** pMethodReturnType, sal_uInt16 index)
    1573             :     SAL_THROW_EXTERN_C()
    1574             : {
    1575       54140 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1576             : 
    1577       54140 :     if (pEntry == NULL)
    1578             :     {
    1579           0 :         rtl_uString_new(pMethodReturnType);
    1580       54140 :         return;
    1581             :     }
    1582             : 
    1583       54140 :     const sal_Char* pTmp = pEntry->m_pMethods->getMethodReturnType(index);
    1584             :     rtl_string2UString(
    1585             :         pMethodReturnType, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1586       54140 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1587             : }
    1588             : 
    1589      115908 : REG_DLLPUBLIC RTMethodMode TYPEREG_CALLTYPE typereg_reader_getMethodFlags(void * hEntry, sal_uInt16 index)
    1590             :     SAL_THROW_EXTERN_C()
    1591             : {
    1592      115908 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1593             : 
    1594      115908 :     if (pEntry == NULL) return RT_MODE_INVALID;
    1595             : 
    1596      115908 :     return pEntry->m_pMethods->getMethodMode(index);
    1597             : }
    1598             : 
    1599       11711 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getMethodDocumentation(void * hEntry, rtl_uString** pMethodDoku, sal_uInt16 index)
    1600             :     SAL_THROW_EXTERN_C()
    1601             : {
    1602       11711 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1603             : 
    1604       11711 :     if (pEntry == NULL)
    1605             :     {
    1606           0 :         rtl_uString_new(pMethodDoku);
    1607       11711 :         return;
    1608             :     }
    1609             : 
    1610       11711 :     const sal_Char* pTmp = pEntry->m_pMethods->getMethodDoku(index);
    1611             :     rtl_string2UString(
    1612             :         pMethodDoku, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1613       11711 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1614             : }
    1615             : 
    1616       41180 : REG_DLLPUBLIC sal_uInt16 TYPEREG_CALLTYPE typereg_reader_getReferenceCount(void * hEntry) SAL_THROW_EXTERN_C()
    1617             : {
    1618       41180 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1619             : 
    1620       41180 :     if (pEntry == NULL) return 0;
    1621             : 
    1622       41180 :     return pEntry->m_pReferences->m_numOfEntries;
    1623             : }
    1624             : 
    1625           0 : static sal_uInt32 TYPEREG_CALLTYPE getReferenceCount(TypeReaderImpl hEntry)
    1626             : {
    1627           0 :     return typereg_reader_getReferenceCount(hEntry);
    1628             : }
    1629             : 
    1630        6227 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getReferenceTypeName(void * hEntry, rtl_uString** pReferenceName, sal_uInt16 index)
    1631             :     SAL_THROW_EXTERN_C()
    1632             : {
    1633        6227 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1634             : 
    1635        6227 :     if (pEntry == NULL)
    1636             :     {
    1637           0 :         rtl_uString_new(pReferenceName);
    1638        6227 :         return;
    1639             :     }
    1640             : 
    1641        6227 :     const sal_Char* pTmp = pEntry->m_pReferences->getReferenceName(index);
    1642             :     rtl_string2UString(
    1643             :         pReferenceName, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1644        6227 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1645             : }
    1646             : 
    1647        5820 : REG_DLLPUBLIC RTReferenceType TYPEREG_CALLTYPE typereg_reader_getReferenceSort(void * hEntry, sal_uInt16 index)
    1648             :     SAL_THROW_EXTERN_C()
    1649             : {
    1650        5820 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1651             : 
    1652        5820 :     if (pEntry == NULL) return RT_REF_INVALID;
    1653             : 
    1654        5820 :     return pEntry->m_pReferences->getReferenceType(index);
    1655             : }
    1656             : 
    1657           0 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getReferenceDocumentation(void * hEntry, rtl_uString** pReferenceDoku, sal_uInt16 index)
    1658             :     SAL_THROW_EXTERN_C()
    1659             : {
    1660           0 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1661             : 
    1662           0 :     if (pEntry == NULL)
    1663             :     {
    1664           0 :         rtl_uString_new(pReferenceDoku);
    1665           0 :         return;
    1666             :     }
    1667             : 
    1668           0 :     const sal_Char* pTmp = pEntry->m_pReferences->getReferenceDoku(index);
    1669             :     rtl_string2UString(
    1670             :         pReferenceDoku, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1671           0 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1672             : }
    1673             : 
    1674         199 : REG_DLLPUBLIC RTFieldAccess TYPEREG_CALLTYPE typereg_reader_getReferenceFlags(void * hEntry, sal_uInt16 index)
    1675             :     SAL_THROW_EXTERN_C()
    1676             : {
    1677         199 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1678             : 
    1679         199 :     if (pEntry == NULL) return RT_ACCESS_INVALID;
    1680             : 
    1681         199 :     return pEntry->m_pReferences->getReferenceAccess(index);
    1682             : }
    1683             : 
    1684       55118 : REG_DLLPUBLIC sal_uInt16 TYPEREG_CALLTYPE typereg_reader_getSuperTypeCount(void * hEntry)
    1685             :     SAL_THROW_EXTERN_C()
    1686             : {
    1687       55118 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1688             : 
    1689       55118 :     if (pEntry == NULL) return 0;
    1690             : 
    1691       55118 :     return pEntry->m_nSuperTypes;
    1692             : }
    1693             : 
    1694       27409 : REG_DLLPUBLIC void TYPEREG_CALLTYPE typereg_reader_getSuperTypeName(
    1695             :     void * hEntry, rtl_uString ** pSuperTypeName, sal_uInt16 index)
    1696             :     SAL_THROW_EXTERN_C()
    1697             : {
    1698       27409 :     TypeRegistryEntry* pEntry = (TypeRegistryEntry*) hEntry;
    1699             : 
    1700       27409 :     if (pEntry == NULL)
    1701             :     {
    1702           0 :         rtl_uString_new(pSuperTypeName);
    1703       27409 :         return;
    1704             :     }
    1705             : 
    1706             :     OSL_ASSERT(index < pEntry->m_nSuperTypes);
    1707       27409 :     const sal_Char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(pEntry->m_offset_SUPERTYPES + (index * sizeof(sal_uInt16))));
    1708             :     rtl_string2UString(
    1709             :         pSuperTypeName, pTmp, pTmp == 0 ? 0 : rtl_str_getLength(pTmp),
    1710       27409 :         RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
    1711             : }
    1712             : 
    1713       40828 : REG_DLLPUBLIC RegistryTypeReader_Api* TYPEREG_CALLTYPE initRegistryTypeReader_Api(void)
    1714             : {
    1715             :     static RegistryTypeReader_Api aApi= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    1716       40828 :     if (!aApi.acquire)
    1717             :     {
    1718           5 :         aApi.createEntry            = &createEntry;
    1719           5 :         aApi.acquire                = &typereg_reader_acquire;
    1720           5 :         aApi.release                = &typereg_reader_release;
    1721           5 :         aApi.getMinorVersion        = &getMinorVersion;
    1722           5 :         aApi.getMajorVersion        = &getMajorVersion;
    1723           5 :         aApi.getTypeClass           = &typereg_reader_getTypeClass;
    1724           5 :         aApi.getTypeName            = &typereg_reader_getTypeName;
    1725           5 :         aApi.getSuperTypeName       = &getSuperTypeName;
    1726           5 :         aApi.getUik                 = &getUik;
    1727           5 :         aApi.getDoku                = &typereg_reader_getDocumentation;
    1728           5 :         aApi.getFileName            = &typereg_reader_getFileName;
    1729           5 :         aApi.getFieldCount          = &getFieldCount;
    1730           5 :         aApi.getFieldName           = &typereg_reader_getFieldName;
    1731           5 :         aApi.getFieldType           = &typereg_reader_getFieldTypeName;
    1732           5 :         aApi.getFieldAccess         = &typereg_reader_getFieldFlags;
    1733           5 :         aApi.getFieldConstValue     = &getFieldConstValue;
    1734           5 :         aApi.getFieldDoku           = &typereg_reader_getFieldDocumentation;
    1735           5 :         aApi.getFieldFileName       = &typereg_reader_getFieldFileName;
    1736           5 :         aApi.getMethodCount         = &getMethodCount;
    1737           5 :         aApi.getMethodName          = &typereg_reader_getMethodName;
    1738           5 :         aApi.getMethodParamCount    = &getMethodParamCount;
    1739           5 :         aApi.getMethodParamType = &typereg_reader_getMethodParameterTypeName;
    1740           5 :         aApi.getMethodParamName     = &typereg_reader_getMethodParameterName;
    1741           5 :         aApi.getMethodParamMode     = &typereg_reader_getMethodParameterFlags;
    1742           5 :         aApi.getMethodExcCount      = &getMethodExcCount;
    1743           5 :         aApi.getMethodExcType = &typereg_reader_getMethodExceptionTypeName;
    1744           5 :         aApi.getMethodReturnType    = &typereg_reader_getMethodReturnTypeName;
    1745           5 :         aApi.getMethodMode          = &typereg_reader_getMethodFlags;
    1746           5 :         aApi.getMethodDoku          = &typereg_reader_getMethodDocumentation;
    1747           5 :         aApi.getReferenceCount      = &getReferenceCount;
    1748           5 :         aApi.getReferenceName       = &typereg_reader_getReferenceTypeName;
    1749           5 :         aApi.getReferenceType       = &typereg_reader_getReferenceSort;
    1750           5 :         aApi.getReferenceDoku       = &typereg_reader_getReferenceDocumentation;
    1751           5 :         aApi.getReferenceAccess     = &typereg_reader_getReferenceFlags;
    1752             : 
    1753           5 :         return (&aApi);
    1754             :     }
    1755             :     else
    1756             :     {
    1757       40823 :         return (&aApi);
    1758             :     }
    1759             : }
    1760             : 
    1761             : }
    1762             : 
    1763             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10