LCOV - code coverage report
Current view: top level - libreoffice/tools/source/ref - globname.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 192 208 92.3 %
Date: 2012-12-27 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        1760 : ImpSvGlobalName::ImpSvGlobalName( const ImpSvGlobalName & rObj )
      32             : {
      33        1760 :     nRefCount = 0;
      34        1760 :     memcpy( szData, rObj.szData, sizeof( szData ) );
      35        1760 : }
      36             : 
      37          27 : ImpSvGlobalName::ImpSvGlobalName( Empty )
      38             : {
      39          27 :     nRefCount = 1;
      40          27 :     memset( szData, 0, sizeof( szData ) );
      41          27 : }
      42             : 
      43       28320 : sal_Bool ImpSvGlobalName::operator == ( const ImpSvGlobalName & rObj ) const
      44             : {
      45       28320 :     return !memcmp( szData, rObj.szData, sizeof( szData ) );
      46             : }
      47             : 
      48             : // SvGlobalName ----------------------------------------------------------------
      49             : 
      50       16830 : SvGlobalName::SvGlobalName()
      51             : {
      52       16830 :     static ImpSvGlobalName aNoName( ImpSvGlobalName::EMPTY );
      53             : 
      54       16830 :     pImp = &aNoName;
      55       16830 :     pImp->nRefCount++;
      56       16830 : }
      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           6 : SvGlobalName::SvGlobalName( const CLSID & rId )
      70             : {
      71           6 :     pImp = new ImpSvGlobalName();
      72           6 :     pImp->nRefCount++;
      73           6 :     memcpy( pImp->szData, &rId, sizeof( pImp->szData ) );
      74           6 : }
      75             : 
      76       23679 : 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       23679 :     pImp = new ImpSvGlobalName();
      81       23679 :     pImp->nRefCount++;
      82             : 
      83       23679 :     memcpy(pImp->szData, &n1, sizeof(n1));
      84       23679 :     memcpy(pImp->szData+4, &n2, sizeof(n2));
      85       23679 :     memcpy(pImp->szData+6, &n3, sizeof(n3));
      86       23679 :     pImp->szData[ 8  ] = b8;
      87       23679 :     pImp->szData[ 9  ] = b9;
      88       23679 :     pImp->szData[ 10 ] = b10;
      89       23679 :     pImp->szData[ 11 ] = b11;
      90       23679 :     pImp->szData[ 12 ] = b12;
      91       23679 :     pImp->szData[ 13 ] = b13;
      92       23679 :     pImp->szData[ 14 ] = b14;
      93       23679 :     pImp->szData[ 15 ] = b15;
      94       23679 : }
      95             : 
      96       47763 : SvGlobalName::~SvGlobalName()
      97             : {
      98       47763 :     pImp->nRefCount--;
      99       47763 :     if( !pImp->nRefCount )
     100       30459 :         delete pImp;
     101       47763 : }
     102             : 
     103        2649 : SvGlobalName & SvGlobalName::operator = ( const SvGlobalName & rObj )
     104             : {
     105        2649 :     rObj.pImp->nRefCount++;
     106        2649 :     pImp->nRefCount--;
     107        2649 :     if( !pImp->nRefCount )
     108           0 :         delete pImp;
     109        2649 :     pImp = rObj.pImp;
     110        2649 :     return *this;
     111             : }
     112             : 
     113        1760 : void SvGlobalName::NewImp()
     114             : {
     115        1760 :     if( pImp->nRefCount > 1 )
     116             :     {
     117        1760 :         pImp->nRefCount--;
     118        1760 :         pImp = new ImpSvGlobalName( *pImp );
     119        1760 :         pImp->nRefCount++;
     120             :     }
     121        1760 : }
     122             : 
     123        1544 : SvStream& operator << ( SvStream& rOStr, const SvGlobalName & rObj )
     124             : {
     125             :     sal_uInt32 a;
     126        1544 :     memcpy(&a, rObj.pImp->szData, sizeof(sal_uInt32));
     127        1544 :     rOStr << a;
     128             : 
     129             :     sal_uInt16 b;
     130        1544 :     memcpy(&b, rObj.pImp->szData+4, sizeof(sal_uInt16));
     131        1544 :     rOStr << b;
     132             : 
     133        1544 :     memcpy(&b, rObj.pImp->szData+6, sizeof(sal_uInt16));
     134        1544 :     rOStr << b;
     135             : 
     136        1544 :     rOStr.Write( (sal_Char *)&rObj.pImp->szData[ 8 ], 8 );
     137        1544 :     return rOStr;
     138             : }
     139             : 
     140         224 : SvStream& operator >> ( SvStream& rStr, SvGlobalName & rObj )
     141             : {
     142         224 :     rObj.NewImp(); // copy if necessary
     143             : 
     144             :     sal_uInt32 a;
     145         224 :     rStr >> a;
     146         224 :     memcpy(rObj.pImp->szData, &a, sizeof(sal_uInt32));
     147             : 
     148             :     sal_uInt16 b;
     149         224 :     rStr >> b;
     150         224 :     memcpy(rObj.pImp->szData+4, &b, sizeof(sal_uInt16));
     151             : 
     152         224 :     rStr >> b;
     153         224 :     memcpy(rObj.pImp->szData+6, &b, sizeof(sal_uInt16));
     154             : 
     155         224 :     rStr.Read( (sal_Char *)&rObj.pImp->szData[ 8 ], 8 );
     156         224 :     return rStr;
     157             : }
     158             : 
     159             : 
     160        1735 : sal_Bool SvGlobalName::operator < ( const SvGlobalName & rObj ) const
     161             : {
     162        1735 :     int n = memcmp( pImp->szData +6, rObj.pImp->szData +6,
     163        1735 :                     sizeof( pImp->szData ) -6);
     164        1735 :     if( n < 0 )
     165           0 :         return sal_True;
     166        1735 :     else if( n > 0 )
     167           0 :         return sal_False;
     168             : 
     169             :     sal_uInt16 Data2_a;
     170        1735 :     memcpy(&Data2_a, pImp->szData+4, sizeof(sal_uInt16));
     171             : 
     172             :     sal_uInt16 Data2_b;
     173        1735 :     memcpy(&Data2_b, rObj.pImp->szData+4, sizeof(sal_uInt16));
     174             : 
     175        1735 :     if( Data2_a < Data2_b )
     176         413 :         return sal_True;
     177        1322 :     else if( Data2_a == Data2_b )
     178             :     {
     179             :         sal_uInt32 Data1_a;
     180        1322 :         memcpy(&Data1_a, pImp->szData, sizeof(sal_uInt32));
     181             : 
     182             :         sal_uInt32 Data1_b;
     183        1322 :         memcpy(&Data1_b, rObj.pImp->szData, sizeof(sal_uInt32));
     184             : 
     185        1322 :         return Data1_a  < Data1_b;
     186             :     }
     187             :     else
     188           0 :         return sal_False;
     189             : 
     190             : }
     191             : 
     192        1452 : SvGlobalName & SvGlobalName::operator += ( sal_uInt32 n )
     193             : {
     194        1452 :     NewImp();
     195             : 
     196             :     sal_uInt32 nOld;
     197        1452 :     memcpy(&nOld, pImp->szData, sizeof(sal_uInt32));
     198        1452 :     sal_uInt32 nNew = nOld + n;
     199        1452 :     memcpy(pImp->szData, &nNew, sizeof(sal_uInt32));
     200             : 
     201        1452 :     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        1452 :     return *this;
     210             : }
     211             : 
     212       28320 : sal_Bool SvGlobalName::operator == ( const SvGlobalName & rObj ) const
     213             : {
     214       28320 :     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          84 : sal_Bool SvGlobalName::MakeId( const String & rIdStr )
     224             : {
     225             :     rtl::OString aStr(rtl::OUStringToOString(rIdStr,
     226          84 :         RTL_TEXTENCODING_ASCII_US));
     227          84 :     const sal_Char *pStr = aStr.getStr();
     228         420 :     if( rIdStr.Len() == 36
     229         168 :       && '-' == pStr[ 8 ]  && '-' == pStr[ 13 ]
     230         168 :       && '-' == pStr[ 18 ] && '-' == pStr[ 23 ] )
     231             :     {
     232          84 :         sal_uInt32 nFirst = 0;
     233          84 :         int i = 0;
     234         756 :         for( i = 0; i < 8; i++ )
     235             :         {
     236         672 :             if( isxdigit( *pStr ) )
     237         672 :                 if( isdigit( *pStr ) )
     238         439 :                     nFirst = nFirst * 16 + (*pStr - '0');
     239             :                 else
     240         233 :                     nFirst = nFirst * 16 + (toupper( *pStr ) - 'A' + 10 );
     241             :             else
     242           0 :                 return sal_False;
     243         672 :             pStr++;
     244             :         }
     245             : 
     246          84 :         sal_uInt16 nSec = 0;
     247          84 :         pStr++;
     248         420 :         for( i = 0; i < 4; i++ )
     249             :         {
     250         336 :             if( isxdigit( *pStr ) )
     251         336 :                 if( isdigit( *pStr ) )
     252         211 :                     nSec = nSec * 16 + (*pStr - '0');
     253             :                 else
     254         125 :                     nSec = nSec * 16 + (sal_uInt16)(toupper( *pStr ) - 'A' + 10 );
     255             :             else
     256           0 :                 return sal_False;
     257         336 :             pStr++;
     258             :         }
     259             : 
     260          84 :         sal_uInt16 nThird = 0;
     261          84 :         pStr++;
     262         420 :         for( i = 0; i < 4; i++ )
     263             :         {
     264         336 :             if( isxdigit( *pStr ) )
     265         336 :                 if( isdigit( *pStr ) )
     266         239 :                     nThird = nThird * 16 + (*pStr - '0');
     267             :                 else
     268          97 :                     nThird = nThird * 16 + (sal_uInt16)(toupper( *pStr ) - 'A' + 10 );
     269             :             else
     270           0 :                 return sal_False;
     271         336 :             pStr++;
     272             :         }
     273             : 
     274             :         sal_Int8 szRemain[ 8 ];
     275          84 :         memset( szRemain, 0, sizeof( szRemain ) );
     276          84 :         pStr++;
     277        1428 :         for( i = 0; i < 16; i++ )
     278             :         {
     279        1344 :             if( isxdigit( *pStr ) )
     280        1344 :                 if( isdigit( *pStr ) )
     281        1011 :                     szRemain[i/2] = szRemain[i/2] * 16 + (*pStr - '0');
     282             :                 else
     283         333 :                     szRemain[i/2] = szRemain[i/2] * 16 + (sal_Int8)(toupper( *pStr ) - 'A' + 10 );
     284             :             else
     285           0 :                 return sal_False;
     286        1344 :             pStr++;
     287        1344 :             if( i == 3 )
     288          84 :                 pStr++;
     289             :         }
     290             : 
     291          84 :         NewImp();
     292          84 :         memcpy(&pImp->szData[0], &nFirst, sizeof(nFirst));
     293          84 :         memcpy(&pImp->szData[4], &nSec, sizeof(nSec));
     294          84 :         memcpy(&pImp->szData[6], &nThird, sizeof(nThird));
     295          84 :         memcpy(&pImp->szData[ 8 ], szRemain, 8);
     296          84 :         return sal_True;
     297             :     }
     298           0 :     return sal_False;
     299             : }
     300             : 
     301         237 : String SvGlobalName::GetHexName() const
     302             : {
     303         237 :     rtl::OStringBuffer aHexBuffer;
     304             : 
     305             :     sal_Char buf[ 10 ];
     306             :     sal_uInt32 Data1;
     307         237 :     memcpy(&Data1, pImp->szData, sizeof(sal_uInt32));
     308         237 :     sprintf( buf, "%8.8" SAL_PRIXUINT32, Data1 );
     309         237 :     aHexBuffer.append(buf);
     310         237 :     aHexBuffer.append('-');
     311             :     sal_uInt16 i ;
     312         711 :     for( i = 4; i < 8; i += 2 )
     313             :     {
     314             :         sal_uInt16 Data2;
     315         474 :         memcpy(&Data2, pImp->szData+i, sizeof(sal_uInt16));
     316         474 :         sprintf( buf, "%4.4X", Data2 );
     317         474 :         aHexBuffer.append(buf);
     318         474 :         aHexBuffer.append('-');
     319             :     }
     320         711 :     for( i = 8; i < 10; i++ )
     321             :     {
     322         474 :         sprintf( buf, "%2.2x", pImp->szData[ i ] );
     323         474 :         aHexBuffer.append(buf);
     324             :     }
     325         237 :     aHexBuffer.append('-');
     326        1659 :     for( i = 10; i < 16; i++ )
     327             :     {
     328        1422 :         sprintf( buf, "%2.2x", pImp->szData[ i ] );
     329        1422 :         aHexBuffer.append(buf);
     330             :     }
     331         237 :     return rtl::OStringToOUString(aHexBuffer.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US);
     332             : }
     333             : 
     334        2116 : com::sun::star::uno::Sequence < sal_Int8 > SvGlobalName::GetByteSequence() const
     335             : {
     336             :     // platform independent representation of a "GlobalName"
     337             :     // maybe transported remotely
     338        2116 :     com::sun::star::uno::Sequence< sal_Int8 > aResult( 16 );
     339             : 
     340             :     sal_uInt32 Data1;
     341        2116 :     memcpy(&Data1, pImp->szData, sizeof(sal_uInt32));
     342        2116 :     aResult[0] = (sal_Int8) (Data1 >> 24);
     343        2116 :     aResult[1] = (sal_Int8) ((Data1 << 8 ) >> 24);
     344        2116 :     aResult[2] = (sal_Int8) ((Data1 << 16 ) >> 24);
     345        2116 :     aResult[3] = (sal_Int8) ((Data1 << 24 ) >> 24);
     346             :     sal_uInt16 Data2;
     347        2116 :     memcpy(&Data2, pImp->szData+4, sizeof(sal_uInt16));
     348        2116 :     aResult[4] = (sal_Int8) (Data2 >> 8);
     349        2116 :     aResult[5] = (sal_Int8) ((Data2 << 8 ) >> 8);
     350             :     sal_uInt16 Data3;
     351        2116 :     memcpy(&Data3, pImp->szData+6, sizeof(sal_uInt16));
     352        2116 :     aResult[6] = (sal_Int8) (Data3 >> 8);
     353        2116 :     aResult[7] = (sal_Int8) ((Data3 << 8 ) >> 8);
     354        2116 :     aResult[8] = pImp->szData[ 8 ];
     355        2116 :     aResult[9] = pImp->szData[ 9 ];
     356        2116 :     aResult[10] = pImp->szData[ 10 ];
     357        2116 :     aResult[11] = pImp->szData[ 11 ];
     358        2116 :     aResult[12] = pImp->szData[ 12 ];
     359        2116 :     aResult[13] = pImp->szData[ 13 ];
     360        2116 :     aResult[14] = pImp->szData[ 14 ];
     361        2116 :     aResult[15] = pImp->szData[ 15 ];
     362             : 
     363        2116 :     return aResult;
     364             : }
     365             : 
     366        5447 : SvGlobalName::SvGlobalName( const com::sun::star::uno::Sequence < sal_Int8 >& aSeq )
     367             : {
     368             :     // create SvGlobalName from a platform independent representation
     369             :     GUID aResult;
     370        5447 :     memset( &aResult, 0, sizeof( aResult ) );
     371        5447 :     if ( aSeq.getLength() == 16 )
     372             :     {
     373        5441 :         aResult.Data1 = ( ( ( ( ( ( sal_uInt8 )aSeq[0] << 8 ) + ( sal_uInt8 )aSeq[1] ) << 8 ) + ( sal_uInt8 )aSeq[2] ) << 8 ) + ( sal_uInt8 )aSeq[3];
     374        5441 :         aResult.Data2 = ( ( sal_uInt8 )aSeq[4] << 8 ) + ( sal_uInt8 )aSeq[5];
     375        5441 :         aResult.Data3 = ( ( sal_uInt8 )aSeq[6] << 8 ) + ( sal_uInt8 )aSeq[7];
     376       48969 :         for( int nInd = 0; nInd < 8; nInd++ )
     377       43528 :             aResult.Data4[nInd] = ( sal_uInt8 )aSeq[nInd+8];
     378             :     }
     379             : 
     380        5447 :     pImp = new ImpSvGlobalName();
     381        5447 :     pImp->nRefCount++;
     382        5447 :     memcpy( pImp->szData, &aResult, sizeof( pImp->szData ) );
     383        5447 : }
     384             : 
     385             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10