LCOV - code coverage report
Current view: top level - tools/source/ref - globname.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 192 208 92.3 %
Date: 2014-04-11 Functions: 18 19 94.7 %
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             : 
      31        2231 : ImpSvGlobalName::ImpSvGlobalName( const ImpSvGlobalName & rObj )
      32             : {
      33        2231 :     nRefCount = 0;
      34        2231 :     memcpy( szData, rObj.szData, sizeof( szData ) );
      35        2231 : }
      36             : 
      37          90 : ImpSvGlobalName::ImpSvGlobalName( Empty )
      38             : {
      39          90 :     nRefCount = 1;
      40          90 :     memset( szData, 0, sizeof( szData ) );
      41          90 : }
      42             : 
      43      254436 : bool ImpSvGlobalName::operator == ( const ImpSvGlobalName & rObj ) const
      44             : {
      45      254436 :     return !memcmp( szData, rObj.szData, sizeof( szData ) );
      46             : }
      47             : 
      48             : // SvGlobalName ----------------------------------------------------------------
      49             : 
      50       28849 : SvGlobalName::SvGlobalName()
      51             : {
      52       28849 :     static ImpSvGlobalName aNoName( ImpSvGlobalName::EMPTY );
      53             : 
      54       28849 :     pImp = &aNoName;
      55       28849 :     pImp->nRefCount++;
      56       28849 : }
      57             : 
      58             : #ifdef WNT
      59             : struct _GUID
      60             : #else
      61             : struct GUID
      62             : #endif
      63             : {
      64             :     sal_uInt32 Data1;
      65             :     sal_uInt16 Data2;
      66             :     sal_uInt16 Data3;
      67             :     sal_uInt8  Data4[8];
      68             : };
      69          23 : SvGlobalName::SvGlobalName( const CLSID & rId )
      70             : {
      71          23 :     pImp = new ImpSvGlobalName();
      72          23 :     pImp->nRefCount++;
      73          23 :     memcpy( pImp->szData, &rId, sizeof( pImp->szData ) );
      74          23 : }
      75             : 
      76      305370 : SvGlobalName::SvGlobalName( sal_uInt32 n1, sal_uInt16 n2, sal_uInt16 n3,
      77             :                             sal_uInt8 b8, sal_uInt8 b9, sal_uInt8 b10, sal_uInt8 b11,
      78             :                             sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15 )
      79             : {
      80      305370 :     pImp = new ImpSvGlobalName();
      81      305370 :     pImp->nRefCount++;
      82             : 
      83      305370 :     memcpy(pImp->szData, &n1, sizeof(n1));
      84      305370 :     memcpy(pImp->szData+4, &n2, sizeof(n2));
      85      305370 :     memcpy(pImp->szData+6, &n3, sizeof(n3));
      86      305370 :     pImp->szData[ 8  ] = b8;
      87      305370 :     pImp->szData[ 9  ] = b9;
      88      305370 :     pImp->szData[ 10 ] = b10;
      89      305370 :     pImp->szData[ 11 ] = b11;
      90      305370 :     pImp->szData[ 12 ] = b12;
      91      305370 :     pImp->szData[ 13 ] = b13;
      92      305370 :     pImp->szData[ 14 ] = b14;
      93      305370 :     pImp->szData[ 15 ] = b15;
      94      305370 : }
      95             : 
      96      407819 : SvGlobalName::~SvGlobalName()
      97             : {
      98      407819 :     pImp->nRefCount--;
      99      407819 :     if( !pImp->nRefCount )
     100      370318 :         delete pImp;
     101      407819 : }
     102             : 
     103        5867 : SvGlobalName & SvGlobalName::operator = ( const SvGlobalName & rObj )
     104             : {
     105        5867 :     rObj.pImp->nRefCount++;
     106        5867 :     pImp->nRefCount--;
     107        5867 :     if( !pImp->nRefCount )
     108           0 :         delete pImp;
     109        5867 :     pImp = rObj.pImp;
     110        5867 :     return *this;
     111             : }
     112             : 
     113        2231 : void SvGlobalName::NewImp()
     114             : {
     115        2231 :     if( pImp->nRefCount > 1 )
     116             :     {
     117        2231 :         pImp->nRefCount--;
     118        2231 :         pImp = new ImpSvGlobalName( *pImp );
     119        2231 :         pImp->nRefCount++;
     120             :     }
     121        2231 : }
     122             : 
     123        1675 : SvStream& WriteSvGlobalName( SvStream& rOStr, const SvGlobalName & rObj )
     124             : {
     125             :     sal_uInt32 a;
     126        1675 :     memcpy(&a, rObj.pImp->szData, sizeof(sal_uInt32));
     127        1675 :     rOStr.WriteUInt32( a );
     128             : 
     129             :     sal_uInt16 b;
     130        1675 :     memcpy(&b, rObj.pImp->szData+4, sizeof(sal_uInt16));
     131        1675 :     rOStr.WriteUInt16( b );
     132             : 
     133        1675 :     memcpy(&b, rObj.pImp->szData+6, sizeof(sal_uInt16));
     134        1675 :     rOStr.WriteUInt16( b );
     135             : 
     136        1675 :     rOStr.Write( (sal_Char *)&rObj.pImp->szData[ 8 ], 8 );
     137        1675 :     return rOStr;
     138             : }
     139             : 
     140         604 : SvStream& operator >> ( SvStream& rStr, SvGlobalName & rObj )
     141             : {
     142         604 :     rObj.NewImp(); // copy if necessary
     143             : 
     144             :     sal_uInt32 a;
     145         604 :     rStr.ReadUInt32( a );
     146         604 :     memcpy(rObj.pImp->szData, &a, sizeof(sal_uInt32));
     147             : 
     148             :     sal_uInt16 b;
     149         604 :     rStr.ReadUInt16( b );
     150         604 :     memcpy(rObj.pImp->szData+4, &b, sizeof(sal_uInt16));
     151             : 
     152         604 :     rStr.ReadUInt16( b );
     153         604 :     memcpy(rObj.pImp->szData+6, &b, sizeof(sal_uInt16));
     154             : 
     155         604 :     rStr.Read( (sal_Char *)&rObj.pImp->szData[ 8 ], 8 );
     156         604 :     return rStr;
     157             : }
     158             : 
     159             : 
     160        2297 : bool SvGlobalName::operator < ( const SvGlobalName & rObj ) const
     161             : {
     162        2297 :     int n = memcmp( pImp->szData +6, rObj.pImp->szData +6,
     163        4594 :                     sizeof( pImp->szData ) -6);
     164        2297 :     if( n < 0 )
     165           0 :         return true;
     166        2297 :     else if( n > 0 )
     167           0 :         return false;
     168             : 
     169             :     sal_uInt16 Data2_a;
     170        2297 :     memcpy(&Data2_a, pImp->szData+4, sizeof(sal_uInt16));
     171             : 
     172             :     sal_uInt16 Data2_b;
     173        2297 :     memcpy(&Data2_b, rObj.pImp->szData+4, sizeof(sal_uInt16));
     174             : 
     175        2297 :     if( Data2_a < Data2_b )
     176         419 :         return true;
     177        1878 :     else if( Data2_a == Data2_b )
     178             :     {
     179             :         sal_uInt32 Data1_a;
     180        1878 :         memcpy(&Data1_a, pImp->szData, sizeof(sal_uInt32));
     181             : 
     182             :         sal_uInt32 Data1_b;
     183        1878 :         memcpy(&Data1_b, rObj.pImp->szData, sizeof(sal_uInt32));
     184             : 
     185        1878 :         return Data1_a  < Data1_b;
     186             :     }
     187             :     else
     188           0 :         return false;
     189             : 
     190             : }
     191             : 
     192        1473 : SvGlobalName & SvGlobalName::operator += ( sal_uInt32 n )
     193             : {
     194        1473 :     NewImp();
     195             : 
     196             :     sal_uInt32 nOld;
     197        1473 :     memcpy(&nOld, pImp->szData, sizeof(sal_uInt32));
     198        1473 :     sal_uInt32 nNew = nOld + n;
     199        1473 :     memcpy(pImp->szData, &nNew, sizeof(sal_uInt32));
     200             : 
     201        1473 :     if( nOld > nNew )
     202             :     {
     203             :         // overflow
     204             :         sal_uInt16 Data2;
     205           0 :         memcpy(&Data2, pImp->szData + 4, sizeof(sal_uInt16));
     206           0 :         ++Data2;
     207           0 :         memcpy(pImp->szData + 4, &Data2, sizeof(sal_uInt16));
     208             :     }
     209        1473 :     return *this;
     210             : }
     211             : 
     212      254436 : bool SvGlobalName::operator == ( const SvGlobalName & rObj ) const
     213             : {
     214      254436 :     return *pImp == *rObj.pImp;
     215             : }
     216             : 
     217           0 : void SvGlobalName::MakeFromMemory( void * pData )
     218             : {
     219           0 :     NewImp();
     220           0 :     memcpy( pImp->szData, pData, sizeof( pImp->szData ) );
     221           0 : }
     222             : 
     223         154 : bool SvGlobalName::MakeId( const OUString & rIdStr )
     224             : {
     225             :     OString aStr(OUStringToOString(rIdStr,
     226         154 :         RTL_TEXTENCODING_ASCII_US));
     227         154 :     const sal_Char *pStr = aStr.getStr();
     228         308 :     if( rIdStr.getLength() == 36
     229         154 :       && '-' == pStr[ 8 ]  && '-' == pStr[ 13 ]
     230         308 :       && '-' == pStr[ 18 ] && '-' == pStr[ 23 ] )
     231             :     {
     232         154 :         sal_uInt32 nFirst = 0;
     233         154 :         int i = 0;
     234        1386 :         for( i = 0; i < 8; i++ )
     235             :         {
     236        1232 :             if( isxdigit( *pStr ) )
     237        1232 :                 if( isdigit( *pStr ) )
     238         720 :                     nFirst = nFirst * 16 + (*pStr - '0');
     239             :                 else
     240         512 :                     nFirst = nFirst * 16 + (toupper( *pStr ) - 'A' + 10 );
     241             :             else
     242           0 :                 return false;
     243        1232 :             pStr++;
     244             :         }
     245             : 
     246         154 :         sal_uInt16 nSec = 0;
     247         154 :         pStr++;
     248         770 :         for( i = 0; i < 4; i++ )
     249             :         {
     250         616 :             if( isxdigit( *pStr ) )
     251         616 :                 if( isdigit( *pStr ) )
     252         420 :                     nSec = nSec * 16 + (*pStr - '0');
     253             :                 else
     254         196 :                     nSec = nSec * 16 + (sal_uInt16)(toupper( *pStr ) - 'A' + 10 );
     255             :             else
     256           0 :                 return false;
     257         616 :             pStr++;
     258             :         }
     259             : 
     260         154 :         sal_uInt16 nThird = 0;
     261         154 :         pStr++;
     262         770 :         for( i = 0; i < 4; i++ )
     263             :         {
     264         616 :             if( isxdigit( *pStr ) )
     265         616 :                 if( isdigit( *pStr ) )
     266         448 :                     nThird = nThird * 16 + (*pStr - '0');
     267             :                 else
     268         168 :                     nThird = nThird * 16 + (sal_uInt16)(toupper( *pStr ) - 'A' + 10 );
     269             :             else
     270           0 :                 return false;
     271         616 :             pStr++;
     272             :         }
     273             : 
     274             :         sal_Int8 szRemain[ 8 ];
     275         154 :         memset( szRemain, 0, sizeof( szRemain ) );
     276         154 :         pStr++;
     277        2618 :         for( i = 0; i < 16; i++ )
     278             :         {
     279        2464 :             if( isxdigit( *pStr ) )
     280        2464 :                 if( isdigit( *pStr ) )
     281        1919 :                     szRemain[i/2] = szRemain[i/2] * 16 + (*pStr - '0');
     282             :                 else
     283         545 :                     szRemain[i/2] = szRemain[i/2] * 16 + (sal_Int8)(toupper( *pStr ) - 'A' + 10 );
     284             :             else
     285           0 :                 return false;
     286        2464 :             pStr++;
     287        2464 :             if( i == 3 )
     288         154 :                 pStr++;
     289             :         }
     290             : 
     291         154 :         NewImp();
     292         154 :         memcpy(&pImp->szData[0], &nFirst, sizeof(nFirst));
     293         154 :         memcpy(&pImp->szData[4], &nSec, sizeof(nSec));
     294         154 :         memcpy(&pImp->szData[6], &nThird, sizeof(nThird));
     295         154 :         memcpy(&pImp->szData[ 8 ], szRemain, 8);
     296         154 :         return true;
     297             :     }
     298           0 :     return false;
     299             : }
     300             : 
     301         911 : OUString SvGlobalName::GetHexName() const
     302             : {
     303         911 :     OStringBuffer aHexBuffer;
     304             : 
     305             :     sal_Char buf[ 10 ];
     306             :     sal_uInt32 Data1;
     307         911 :     memcpy(&Data1, pImp->szData, sizeof(sal_uInt32));
     308         911 :     sprintf( buf, "%8.8" SAL_PRIXUINT32, Data1 );
     309         911 :     aHexBuffer.append(buf);
     310         911 :     aHexBuffer.append('-');
     311             :     sal_uInt16 i ;
     312        2733 :     for( i = 4; i < 8; i += 2 )
     313             :     {
     314             :         sal_uInt16 Data2;
     315        1822 :         memcpy(&Data2, pImp->szData+i, sizeof(sal_uInt16));
     316        1822 :         sprintf( buf, "%4.4X", Data2 );
     317        1822 :         aHexBuffer.append(buf);
     318        1822 :         aHexBuffer.append('-');
     319             :     }
     320        2733 :     for( i = 8; i < 10; i++ )
     321             :     {
     322        1822 :         sprintf( buf, "%2.2x", pImp->szData[ i ] );
     323        1822 :         aHexBuffer.append(buf);
     324             :     }
     325         911 :     aHexBuffer.append('-');
     326        6377 :     for( i = 10; i < 16; i++ )
     327             :     {
     328        5466 :         sprintf( buf, "%2.2x", pImp->szData[ i ] );
     329        5466 :         aHexBuffer.append(buf);
     330             :     }
     331         911 :     return OStringToOUString(aHexBuffer.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US);
     332             : }
     333             : 
     334       54484 : com::sun::star::uno::Sequence < sal_Int8 > SvGlobalName::GetByteSequence() const
     335             : {
     336             :     // platform independent representation of a "GlobalName"
     337             :     // maybe transported remotely
     338       54484 :     com::sun::star::uno::Sequence< sal_Int8 > aResult( 16 );
     339             : 
     340             :     sal_uInt32 Data1;
     341       54484 :     memcpy(&Data1, pImp->szData, sizeof(sal_uInt32));
     342       54484 :     aResult[0] = (sal_Int8) (Data1 >> 24);
     343       54484 :     aResult[1] = (sal_Int8) ((Data1 << 8 ) >> 24);
     344       54484 :     aResult[2] = (sal_Int8) ((Data1 << 16 ) >> 24);
     345       54484 :     aResult[3] = (sal_Int8) ((Data1 << 24 ) >> 24);
     346             :     sal_uInt16 Data2;
     347       54484 :     memcpy(&Data2, pImp->szData+4, sizeof(sal_uInt16));
     348       54484 :     aResult[4] = (sal_Int8) (Data2 >> 8);
     349       54484 :     aResult[5] = (sal_Int8) ((Data2 << 8 ) >> 8);
     350             :     sal_uInt16 Data3;
     351       54484 :     memcpy(&Data3, pImp->szData+6, sizeof(sal_uInt16));
     352       54484 :     aResult[6] = (sal_Int8) (Data3 >> 8);
     353       54484 :     aResult[7] = (sal_Int8) ((Data3 << 8 ) >> 8);
     354       54484 :     aResult[8] = pImp->szData[ 8 ];
     355       54484 :     aResult[9] = pImp->szData[ 9 ];
     356       54484 :     aResult[10] = pImp->szData[ 10 ];
     357       54484 :     aResult[11] = pImp->szData[ 11 ];
     358       54484 :     aResult[12] = pImp->szData[ 12 ];
     359       54484 :     aResult[13] = pImp->szData[ 13 ];
     360       54484 :     aResult[14] = pImp->szData[ 14 ];
     361       54484 :     aResult[15] = pImp->szData[ 15 ];
     362             : 
     363       54484 :     return aResult;
     364             : }
     365             : 
     366       63239 : SvGlobalName::SvGlobalName( const com::sun::star::uno::Sequence < sal_Int8 >& aSeq )
     367             : {
     368             :     // create SvGlobalName from a platform independent representation
     369             :     GUID aResult;
     370       63239 :     memset( &aResult, 0, sizeof( aResult ) );
     371       63239 :     if ( aSeq.getLength() == 16 )
     372             :     {
     373       63093 :         aResult.Data1 = ( ( ( ( ( ( sal_uInt8 )aSeq[0] << 8 ) + ( sal_uInt8 )aSeq[1] ) << 8 ) + ( sal_uInt8 )aSeq[2] ) << 8 ) + ( sal_uInt8 )aSeq[3];
     374       63093 :         aResult.Data2 = ( ( sal_uInt8 )aSeq[4] << 8 ) + ( sal_uInt8 )aSeq[5];
     375       63093 :         aResult.Data3 = ( ( sal_uInt8 )aSeq[6] << 8 ) + ( sal_uInt8 )aSeq[7];
     376      567837 :         for( int nInd = 0; nInd < 8; nInd++ )
     377      504744 :             aResult.Data4[nInd] = ( sal_uInt8 )aSeq[nInd+8];
     378             :     }
     379             : 
     380       63239 :     pImp = new ImpSvGlobalName();
     381       63239 :     pImp->nRefCount++;
     382       63239 :     memcpy( pImp->szData, &aResult, sizeof( pImp->szData ) );
     383       63239 : }
     384             : 
     385             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10