LCOV - code coverage report
Current view: top level - tools/source/ref - globname.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 176 190 92.6 %
Date: 2015-06-13 12:38:46 Functions: 19 20 95.0 %
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             : #include <ctype.h>
      21             : #include <stdio.h>
      22             : #include <string.h>
      23             : 
      24             : #include <rtl/strbuf.hxx>
      25             : 
      26             : #include <tools/stream.hxx>
      27             : #include <tools/globname.hxx>
      28             : 
      29             : // ImpSvGlobalName ------------------------------------------------------------
      30        2678 : ImpSvGlobalName::ImpSvGlobalName( const ImpSvGlobalName & rObj )
      31             :     : szData(rObj.szData)
      32        2678 :     , nRefCount(0)
      33             : {
      34        2678 : }
      35             : 
      36         134 : ImpSvGlobalName::ImpSvGlobalName( Empty )
      37         134 :     : nRefCount(1)
      38             : {
      39         134 :     memset( &szData, 0, sizeof( szData ) );
      40         134 : }
      41             : 
      42      205954 : ImpSvGlobalName::ImpSvGlobalName(sal_uInt32 n1, sal_uInt16 n2, sal_uInt16 n3,
      43             :                           sal_uInt8 b8, sal_uInt8 b9, sal_uInt8 b10, sal_uInt8 b11,
      44             :                           sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15)
      45      205954 :     : nRefCount(0)
      46             : {
      47      205954 :     szData.Data1 = n1;
      48      205954 :     szData.Data2 = n2;
      49      205954 :     szData.Data3 = n3;
      50      205954 :     szData.Data4[0] = b8;
      51      205954 :     szData.Data4[1] = b9;
      52      205954 :     szData.Data4[2] = b10;
      53      205954 :     szData.Data4[3] = b11;
      54      205954 :     szData.Data4[4] = b12;
      55      205954 :     szData.Data4[5] = b13;
      56      205954 :     szData.Data4[6] = b14;
      57      205954 :     szData.Data4[7] = b15;
      58      205954 : }
      59             : 
      60      119449 : bool ImpSvGlobalName::operator == ( const ImpSvGlobalName & rObj ) const
      61             : {
      62      119449 :     return !memcmp( &szData, &rObj.szData, sizeof( szData ) );
      63             : }
      64             : 
      65             : // SvGlobalName ----------------------------------------------------------------
      66       26310 : SvGlobalName::SvGlobalName()
      67             : {
      68       26310 :     static ImpSvGlobalName aNoName( ImpSvGlobalName::EMPTY );
      69             : 
      70       26310 :     pImp = &aNoName;
      71       26310 :     pImp->nRefCount++;
      72       26310 : }
      73             : 
      74          24 : SvGlobalName::SvGlobalName( const SvGUID & rId )
      75             : {
      76          24 :     pImp = new ImpSvGlobalName(rId);
      77          24 :     pImp->nRefCount++;
      78          24 : }
      79             : 
      80      205954 : SvGlobalName::SvGlobalName( sal_uInt32 n1, sal_uInt16 n2, sal_uInt16 n3,
      81             :                             sal_uInt8 b8, sal_uInt8 b9, sal_uInt8 b10, sal_uInt8 b11,
      82             :                             sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15 )
      83             : {
      84      205954 :     pImp = new ImpSvGlobalName(n1, n2, n3, b8, b9, b10, b11, b12, b13, b14, b15);
      85      205954 :     pImp->nRefCount++;
      86      205954 : }
      87             : 
      88      338096 : SvGlobalName::~SvGlobalName()
      89             : {
      90      338096 :     pImp->nRefCount--;
      91      338096 :     if( !pImp->nRefCount )
      92      302093 :         delete pImp;
      93      338096 : }
      94             : 
      95        7523 : SvGlobalName & SvGlobalName::operator = ( const SvGlobalName & rObj )
      96             : {
      97        7523 :     rObj.pImp->nRefCount++;
      98        7523 :     pImp->nRefCount--;
      99        7523 :     if( !pImp->nRefCount )
     100           0 :         delete pImp;
     101        7523 :     pImp = rObj.pImp;
     102        7523 :     return *this;
     103             : }
     104             : 
     105        2678 : void SvGlobalName::NewImp()
     106             : {
     107        2678 :     if( pImp->nRefCount > 1 )
     108             :     {
     109        2678 :         pImp->nRefCount--;
     110        2678 :         pImp = new ImpSvGlobalName( *pImp );
     111        2678 :         pImp->nRefCount++;
     112             :     }
     113        2678 : }
     114             : 
     115         260 : SvStream& WriteSvGlobalName( SvStream& rOStr, const SvGlobalName & rObj )
     116             : {
     117         260 :     rOStr.WriteUInt32( rObj.pImp->szData.Data1 );
     118         260 :     rOStr.WriteUInt16( rObj.pImp->szData.Data2 );
     119         260 :     rOStr.WriteUInt16( rObj.pImp->szData.Data3 );
     120         260 :     rOStr.Write( &rObj.pImp->szData.Data4, 8 );
     121         260 :     return rOStr;
     122             : }
     123             : 
     124         940 : SvStream& operator >> ( SvStream& rStr, SvGlobalName & rObj )
     125             : {
     126         940 :     rObj.NewImp(); // copy if necessary
     127         940 :     rStr.ReadUInt32( rObj.pImp->szData.Data1 );
     128         940 :     rStr.ReadUInt16( rObj.pImp->szData.Data2 );
     129         940 :     rStr.ReadUInt16( rObj.pImp->szData.Data3 );
     130         940 :     rStr.Read( &rObj.pImp->szData.Data4, 8 );
     131         940 :     return rStr;
     132             : }
     133             : 
     134             : 
     135        2907 : bool SvGlobalName::operator < ( const SvGlobalName & rObj ) const
     136             : {
     137        2907 :     if( pImp->szData.Data3 < rObj.pImp->szData.Data3 )
     138           0 :         return true;
     139        2907 :     else if( pImp->szData.Data3 > rObj.pImp->szData.Data3 )
     140           0 :         return false;
     141             : 
     142        2907 :     if( pImp->szData.Data2 < rObj.pImp->szData.Data2 )
     143         421 :         return true;
     144        2486 :     else if( pImp->szData.Data2 > rObj.pImp->szData.Data2 )
     145           0 :         return false;
     146             : 
     147        2486 :     return pImp->szData.Data1 < rObj.pImp->szData.Data1;
     148             : }
     149             : 
     150        1480 : SvGlobalName & SvGlobalName::operator += ( sal_uInt32 n )
     151             : {
     152        1480 :     NewImp();
     153             : 
     154        1480 :     sal_uInt32 nOld = pImp->szData.Data1;
     155        1480 :     pImp->szData.Data1 += n;
     156             : 
     157        1480 :     if( nOld > pImp->szData.Data1 )
     158             :     {
     159             :         // overflow
     160           0 :         pImp->szData.Data2++;
     161             :     }
     162        1480 :     return *this;
     163             : }
     164             : 
     165      119449 : bool SvGlobalName::operator == ( const SvGlobalName & rObj ) const
     166             : {
     167      119449 :     return *pImp == *rObj.pImp;
     168             : }
     169             : 
     170           0 : void SvGlobalName::MakeFromMemory( void * pData )
     171             : {
     172           0 :     NewImp();
     173           0 :     memcpy( &pImp->szData, pData, sizeof( pImp->szData ) );
     174           0 : }
     175             : 
     176         258 : bool SvGlobalName::MakeId( const OUString & rIdStr )
     177             : {
     178             :     OString aStr(OUStringToOString(rIdStr,
     179         258 :         RTL_TEXTENCODING_ASCII_US));
     180         258 :     const sal_Char *pStr = aStr.getStr();
     181         516 :     if( rIdStr.getLength() == 36
     182         258 :       && '-' == pStr[ 8 ]  && '-' == pStr[ 13 ]
     183         516 :       && '-' == pStr[ 18 ] && '-' == pStr[ 23 ] )
     184             :     {
     185         258 :         sal_uInt32 nFirst = 0;
     186         258 :         int i = 0;
     187        2322 :         for( i = 0; i < 8; i++ )
     188             :         {
     189        2064 :             if( isxdigit( *pStr ) )
     190        2064 :                 if( isdigit( *pStr ) )
     191        1139 :                     nFirst = nFirst * 16 + (*pStr - '0');
     192             :                 else
     193         925 :                     nFirst = nFirst * 16 + (toupper( *pStr ) - 'A' + 10 );
     194             :             else
     195           0 :                 return false;
     196        2064 :             pStr++;
     197             :         }
     198             : 
     199         258 :         sal_uInt16 nSec = 0;
     200         258 :         pStr++;
     201        1290 :         for( i = 0; i < 4; i++ )
     202             :         {
     203        1032 :             if( isxdigit( *pStr ) )
     204        1032 :                 if( isdigit( *pStr ) )
     205         727 :                     nSec = nSec * 16 + (*pStr - '0');
     206             :                 else
     207         305 :                     nSec = nSec * 16 + (sal_uInt16)(toupper( *pStr ) - 'A' + 10 );
     208             :             else
     209           0 :                 return false;
     210        1032 :             pStr++;
     211             :         }
     212             : 
     213         258 :         sal_uInt16 nThird = 0;
     214         258 :         pStr++;
     215        1290 :         for( i = 0; i < 4; i++ )
     216             :         {
     217        1032 :             if( isxdigit( *pStr ) )
     218        1032 :                 if( isdigit( *pStr ) )
     219         754 :                     nThird = nThird * 16 + (*pStr - '0');
     220             :                 else
     221         278 :                     nThird = nThird * 16 + (sal_uInt16)(toupper( *pStr ) - 'A' + 10 );
     222             :             else
     223           0 :                 return false;
     224        1032 :             pStr++;
     225             :         }
     226             : 
     227             :         sal_Int8 szRemain[ 8 ];
     228         258 :         memset( szRemain, 0, sizeof( szRemain ) );
     229         258 :         pStr++;
     230        4386 :         for( i = 0; i < 16; i++ )
     231             :         {
     232        4128 :             if( isxdigit( *pStr ) )
     233        4128 :                 if( isdigit( *pStr ) )
     234        3255 :                     szRemain[i/2] = szRemain[i/2] * 16 + (*pStr - '0');
     235             :                 else
     236         873 :                     szRemain[i/2] = szRemain[i/2] * 16 + (sal_Int8)(toupper( *pStr ) - 'A' + 10 );
     237             :             else
     238           0 :                 return false;
     239        4128 :             pStr++;
     240        4128 :             if( i == 3 )
     241         258 :                 pStr++;
     242             :         }
     243             : 
     244         258 :         NewImp();
     245         258 :         memcpy(&pImp->szData.Data1, &nFirst, sizeof(nFirst));
     246         258 :         memcpy(&pImp->szData.Data2, &nSec, sizeof(nSec));
     247         258 :         memcpy(&pImp->szData.Data3, &nThird, sizeof(nThird));
     248         258 :         memcpy(&pImp->szData.Data4, szRemain, 8);
     249         258 :         return true;
     250             :     }
     251           0 :     return false;
     252             : }
     253             : 
     254        1184 : OUString SvGlobalName::GetHexName() const
     255             : {
     256        1184 :     OStringBuffer aHexBuffer;
     257             : 
     258             :     sal_Char buf[ 10 ];
     259        1184 :     sprintf( buf, "%8.8" SAL_PRIXUINT32, pImp->szData.Data1 );
     260        1184 :     aHexBuffer.append(buf);
     261        1184 :     aHexBuffer.append('-');
     262        1184 :     sprintf( buf, "%4.4X", pImp->szData.Data2 );
     263        1184 :     aHexBuffer.append(buf);
     264        1184 :     aHexBuffer.append('-');
     265        1184 :     sprintf( buf, "%4.4X", pImp->szData.Data3 );
     266        1184 :     aHexBuffer.append(buf);
     267        1184 :     aHexBuffer.append('-');
     268        3552 :     for( int i = 0; i < 2; i++ )
     269             :     {
     270        2368 :         sprintf( buf, "%2.2x", pImp->szData.Data4[ i ] );
     271        2368 :         aHexBuffer.append(buf);
     272             :     }
     273        1184 :     aHexBuffer.append('-');
     274        8288 :     for( int i = 2; i < 8; i++ )
     275             :     {
     276        7104 :         sprintf( buf, "%2.2x", pImp->szData.Data4[ i ] );
     277        7104 :         aHexBuffer.append(buf);
     278             :     }
     279        1184 :     return OStringToOUString(aHexBuffer.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US);
     280             : }
     281             : 
     282       81697 : com::sun::star::uno::Sequence < sal_Int8 > SvGlobalName::GetByteSequence() const
     283             : {
     284             :     // platform independent representation of a "GlobalName"
     285             :     // maybe transported remotely
     286       81697 :     com::sun::star::uno::Sequence< sal_Int8 > aResult( 16 );
     287             : 
     288       81697 :     aResult[ 0] = (sal_Int8) (pImp->szData.Data1 >> 24);
     289       81697 :     aResult[ 1] = (sal_Int8) ((pImp->szData.Data1 << 8 ) >> 24);
     290       81697 :     aResult[ 2] = (sal_Int8) ((pImp->szData.Data1 << 16 ) >> 24);
     291       81697 :     aResult[ 3] = (sal_Int8) ((pImp->szData.Data1 << 24 ) >> 24);
     292       81697 :     aResult[ 4] = (sal_Int8) (pImp->szData.Data2 >> 8);
     293       81697 :     aResult[ 5] = (sal_Int8) ((pImp->szData.Data2 << 8 ) >> 8);
     294       81697 :     aResult[ 6] = (sal_Int8) (pImp->szData.Data3 >> 8);
     295       81697 :     aResult[ 7] = (sal_Int8) ((pImp->szData.Data3 << 8 ) >> 8);
     296       81697 :     aResult[ 8] = pImp->szData.Data4[ 0 ];
     297       81697 :     aResult[ 9] = pImp->szData.Data4[ 1 ];
     298       81697 :     aResult[10] = pImp->szData.Data4[ 2 ];
     299       81697 :     aResult[11] = pImp->szData.Data4[ 3 ];
     300       81697 :     aResult[12] = pImp->szData.Data4[ 4 ];
     301       81697 :     aResult[13] = pImp->szData.Data4[ 5 ];
     302       81697 :     aResult[14] = pImp->szData.Data4[ 6 ];
     303       81697 :     aResult[15] = pImp->szData.Data4[ 7 ];
     304             : 
     305       81697 :     return aResult;
     306             : }
     307             : 
     308       93768 : SvGlobalName::SvGlobalName( const com::sun::star::uno::Sequence < sal_Int8 >& aSeq )
     309             : {
     310             :     // create SvGlobalName from a platform independent representation
     311             :     SvGUID aResult;
     312       93768 :     memset( &aResult, 0, sizeof( aResult ) );
     313       93768 :     if ( aSeq.getLength() == 16 )
     314             :     {
     315       93565 :         aResult.Data1 = ( ( ( ( ( ( sal_uInt8 )aSeq[0] << 8 ) + ( sal_uInt8 )aSeq[1] ) << 8 ) + ( sal_uInt8 )aSeq[2] ) << 8 ) + ( sal_uInt8 )aSeq[3];
     316       93565 :         aResult.Data2 = ( ( sal_uInt8 )aSeq[4] << 8 ) + ( sal_uInt8 )aSeq[5];
     317       93565 :         aResult.Data3 = ( ( sal_uInt8 )aSeq[6] << 8 ) + ( sal_uInt8 )aSeq[7];
     318      842085 :         for( int nInd = 0; nInd < 8; nInd++ )
     319      748520 :             aResult.Data4[nInd] = ( sal_uInt8 )aSeq[nInd+8];
     320             :     }
     321             : 
     322       93768 :     pImp = new ImpSvGlobalName(aResult);
     323       93768 :     pImp->nRefCount++;
     324       93768 : }
     325             : 
     326             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11