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

Generated by: LCOV version 1.10