office-gobmx/l10ntools/inc/export.hxx
Stephan Bergmann 7c704c78d3 Removed some unused parameters; added SAL_UNUSED_PARAMETER.
SAL_UNUSED_PARAMETER (expanding to __attribute__ ((unused)) for GCC)
is used to annotate legitimately unused parameters, so that static
analysis tools can tell legitimately unused parameters from truly
unnecessary ones.  To that end, some patches for external modules
are also added, that are only applied when compiling with GCC and
add necessary __attribute__ ((unused)) in headers.
2012-01-21 15:21:16 +01:00

559 lines
17 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef _EXPORT_HXX
#define _EXPORT_HXX
#include <comphelper/string.hxx>
#ifndef L10NTOOLS_DIRECTORY_HXX
#define L10NTOOLS_DIRECTORY_HXX
#include <l10ntools/directory.hxx>
#endif
#include <tools/string.hxx>
#include <tools/stream.hxx>
#include <tools/fsys.hxx>
#include <osl/file.hxx>
#include <osl/file.h>
#include <boost/unordered_map.hpp>
#include <iterator> /* std::iterator*/
#include <set> /* std::set*/
#include <vector> /* std::vector*/
#include <queue>
#include <string>
#include <unistd.h>
#ifdef WNT
#include <direct.h>
#endif
#define NO_TRANSLATE_ISO "x-no-translate"
#define JAPANESE_ISO "ja"
struct eqstr{
sal_Bool operator()(const char* s1, const char* s2) const{
return strcmp(s1,s2)==0;
}
};
struct equalByteString{
bool operator()( const ByteString& rKey1, const ByteString& rKey2 ) const {
return rKey1.CompareTo( rKey2 )==COMPARE_EQUAL;
}
};
struct lessByteString{
bool operator()( const ByteString& rKey1, const ByteString& rKey2 ) const {
return rKey1.CompareTo( rKey2 )==COMPARE_LESS;
}
};
struct hashByteString{
size_t operator()( const ByteString& rName ) const{
return rtl_str_hashCode_WithLength(rName.GetBuffer(), rName.Len() );
}
};
class PFormEntrys;
class MergeData;
typedef std::set<ByteString , lessByteString > ByteStringSet;
typedef boost::unordered_map<rtl::OString, rtl::OString, rtl::OStringHash> ByteStringHashMap;
typedef boost::unordered_map<ByteString , bool , hashByteString,equalByteString>
ByteStringBoolHashMap;
typedef boost::unordered_map<ByteString , PFormEntrys* , hashByteString,equalByteString>
PFormEntrysHashMap;
typedef boost::unordered_map<ByteString , MergeData* , hashByteString,equalByteString>
MergeDataHashMap;
#define SOURCE_LANGUAGE ByteString("en-US")
#define LIST_REFID "LIST_REFID"
typedef ByteStringHashMap ExportListEntry;
typedef ::std::vector< ExportListEntry* > ExportListBase;
//
// class ExportList
//
class ExportList
{
private:
ExportListBase maList;
sal_uLong nSourceLanguageListEntryCount;
public:
ExportList() { nSourceLanguageListEntryCount = 0; }
sal_uLong GetSourceLanguageListEntryCount() { return nSourceLanguageListEntryCount; }
void NewSourceLanguageListEntry() { nSourceLanguageListEntryCount++; }
size_t size() const { return maList.size(); }
void push_back( ExportListEntry* item ) { maList.push_back( item ); }
ExportListEntry* operator [] ( size_t i )
{
return ( i < maList.size() ) ? maList[ i ] : NULL;
}
};
#define REFID_NONE 0xFFFF
//
// struct ResData
//
/******************************************************************************
* Purpose: holds mandatory data to export a single res (used with ResStack)
******************************************************************************/
#define ID_LEVEL_NULL 0x0000
#define ID_LEVEL_AUTOID 0x0001
#define ID_LEVEL_TEXT 0x0002
#define ID_LEVEL_FIELDNAME 0x0003
#define ID_LEVEL_ACCESSPATH 0x0004
#define ID_LEVEL_IDENTIFIER 0x0005
#define ID_LEVEL_LISTINDEX 0x0006
class ResData
{
public:
~ResData();
sal_Bool SetId(const rtl::OString &rId, sal_uInt16 nLevel);
sal_uInt16 nWidth;
sal_uInt16 nChildIndex;
sal_uInt16 nIdLevel;
sal_Bool bChild;
sal_Bool bChildWithText;
sal_Bool bText;
sal_Bool bHelpText;
sal_Bool bQuickHelpText;
sal_Bool bTitle;
sal_Bool bList;
sal_Bool bRestMerged;
ByteString sResTyp;
ByteString sId;
ByteString sGId;
ByteString sHelpId;
ByteString sFilename;
ByteStringHashMap sText;
sal_uInt16 nTextRefId;
ByteStringHashMap sHelpText;
sal_uInt16 nHelpTextRefId;
ByteStringHashMap sQuickHelpText;
sal_uInt16 nQuickHelpTextRefId;
ByteStringHashMap sTitle;
sal_uInt16 nTitleRefId;
ByteString sTextTyp;
ExportList *pStringList;
ExportList *pUIEntries;
ExportList *pItemList;
ExportList *pFilterList;
ExportList *pPairedList;
ByteString sPForm;
void Dump();
ResData( const ByteString &rPF, const ByteString &rGId )
:
nWidth( 0 ),
nChildIndex( 0 ),
nIdLevel( ID_LEVEL_NULL ),
bChild( sal_False ),
bChildWithText( sal_False ),
bText( sal_False ),
bHelpText( sal_False ),
bQuickHelpText( sal_False ),
bTitle( sal_False ),
bList( sal_False ),
bRestMerged( sal_False ),
sGId( rGId ),
nTextRefId( REFID_NONE ),
nHelpTextRefId( REFID_NONE ),
nQuickHelpTextRefId( REFID_NONE ),
nTitleRefId( REFID_NONE ),
sTextTyp( "Text" ),
pStringList( NULL ),
pUIEntries( NULL ),
pItemList( NULL ),
pFilterList( NULL ),
pPairedList( NULL ),
sPForm( rPF )
{
sGId = comphelper::string::remove(sGId, '\r');
sPForm = comphelper::string::remove(sPForm, '\r');
};
ResData( const ByteString &rPF, const ByteString &rGId , const ByteString &rFilename )
:
nChildIndex( 0 ),
nIdLevel( ID_LEVEL_NULL ),
bChild( sal_False ),
bChildWithText( sal_False ),
bText( sal_False ),
bHelpText( sal_False ),
bQuickHelpText( sal_False ),
bTitle( sal_False ),
bList( sal_False ),
bRestMerged( sal_False ),
sGId( rGId ),
sFilename( rFilename ),
nTextRefId( REFID_NONE ),
nHelpTextRefId( REFID_NONE ),
nQuickHelpTextRefId( REFID_NONE ),
nTitleRefId( REFID_NONE ),
sTextTyp( "Text" ),
pStringList( NULL ),
pUIEntries( NULL ),
pItemList( NULL ),
pFilterList( NULL ),
pPairedList( NULL ),
sPForm( rPF )
{
sGId = comphelper::string::remove(sGId, '\r');
sPForm = comphelper::string::remove(sPForm, '\r');
};
};
//
// class Export
//
/******************************************************************************
* Purpose: syntax check and export of *.src, called from lexer
******************************************************************************/
#define LIST_NON 0x0000
#define LIST_STRING 0x0001
#define LIST_FILTER 0x0002
#define LIST_ITEM 0x0004
#define LIST_PAIRED 0x0005
#define LIST_UIENTRIES 0x0008
#define STRING_TYP_TEXT 0x0010
#define STRING_TYP_HELPTEXT 0x0020
#define STRING_TYP_QUICKHELPTEXT 0x0040
#define STRING_TYP_TITLE 0x0080
#define MERGE_MODE_NORMAL 0x0000
#define MERGE_MODE_LIST 0x0001
typedef ::std::vector< ResData* > ResStack;
// forwards
class WordTransformer;
class ParserQueue;
class Export
{
private:
WordTransformer *pWordTransformer;
SvFileStream aOutput;
ResStack aResStack; // stack for parsing recursive
ByteString sActPForm; // hold cur. system
sal_Bool bDefine; // cur. res. in a define?
sal_Bool bNextMustBeDefineEOL; // define but no \ at lineend
sal_uLong nLevel; // res. recursiv? how deep?
sal_uInt16 nList; // cur. res. is String- or FilterList
rtl::OString m_sListLang;
sal_uLong nListIndex;
sal_uLong nListLevel;
bool bSkipFile;
ByteString sProject;
ByteString sRoot;
sal_Bool bEnableExport;
sal_Bool bMergeMode;
ByteString sMergeSrc;
ByteString sLastListLine;
sal_Bool bError; // any errors while export?
sal_Bool bReadOver;
sal_Bool bDontWriteOutput;
ByteString sLastTextTyp;
static bool isInitialized;
ByteString sFilename;
public:
ParserQueue* pParseQueue; // public ?
static rtl::OString sLanguages; // public ?
static rtl::OString sForcedLanguages; // public ?
static bool skipProject( ByteString sPrj ) ;
static void InitLanguages( bool bMergeMode = false );
static void InitForcedLanguages( bool bMergeMode = false );
static std::vector<ByteString> GetLanguages();
static std::vector<ByteString> GetForcedLanguages();
static void SetLanguages( std::vector<ByteString> val );
static void RemoveUTF8ByteOrderMarker( rtl::OString &rString );
static bool hasUTF8ByteOrderMarker( const rtl::OString &rString );
static void RemoveUTF8ByteOrderMarkerFromFile( const ByteString &rFilename );
static bool fileHasUTF8ByteOrderMarker( const ByteString &rString );
static void QuotHTML( ByteString &rString );
static bool CopyFile( const ByteString& source , const ByteString& dest );
static void UnquotHTML( ByteString &rString );
static const char* GetEnv( const char *pVar );
static bool isSourceLanguage( const ByteString &sLanguage );
static bool isAllowed( const ByteString &sLanguage );
static void Languages( std::vector<ByteString>::const_iterator& begin , std::vector<ByteString>::const_iterator& end );
static void getRandomName( const ByteString& sPrefix , ByteString& sRandStr , const ByteString& sPostfix );
static void getCurrentDir( std::string& dir );
static ByteString GetTimeStamp();
static sal_Bool ConvertLineEnds( ByteString sSource, ByteString sDestination );
static ByteString GetNativeFile( ByteString sSource );
static DirEntry GetTempFile();
static void DumpExportList(const rtl::OString& rListName,
ExportList& aList);
static ByteString DumpMap(const rtl::OString& rMapName,
ByteStringHashMap& aMap);
private:
static std::vector<ByteString> aLanguages;
static std::vector<ByteString> aForcedLanguages;
sal_Bool WriteData( ResData *pResData, sal_Bool bCreateNew = sal_False );// called befor dest. cur ResData
sal_Bool WriteExportList( ResData *pResData, ExportList *pExportList,
const ByteString &rTyp, sal_Bool bCreateNew = sal_False );
ByteString MergePairedList( ByteString& sLine , ByteString& sText );
ByteString FullId(); // creates cur. GID
ByteString GetPairedListID ( const ByteString& sText );
ByteString GetPairedListString ( const ByteString& sText );
ByteString StripList ( const ByteString& sText );
void InsertListEntry( const ByteString &rText, const ByteString &rLine );
void CleanValue( ByteString &rValue );
ByteString GetText( const ByteString &rSource, int nToken );
sal_Bool PrepareTextToMerge(ByteString &rText, sal_uInt16 nTyp,
rtl::OString &rLangIndex, ResData *pResData);
void MergeRest( ResData *pResData, sal_uInt16 nMode = MERGE_MODE_NORMAL );
void ConvertMergeContent( ByteString &rText );
void WriteToMerged( const ByteString &rText , bool bSDFContent );
void SetChildWithText();
void CutComment( ByteString &rText );
public:
Export( const ByteString &rOutput, sal_Bool bWrite,
const ByteString &rPrj, const ByteString &rPrjRoot , const ByteString& rFile );
Export( const ByteString &rOutput, sal_Bool bWrite,
const ByteString &rPrj, const ByteString &rPrjRoot,
const ByteString &rMergeSource , const ByteString& rFile );
~Export();
void Init();
int Execute( int nToken, const char * pToken ); // called from lexer
void SetError() { bError = sal_True; }
sal_Bool GetError() { return bError; }
};
//
// class PFormEntrys
//
/******************************************************************************
* Purpose: holds information of data to merge (one pform)
******************************************************************************/
class PFormEntrys : public ByteString
{
friend class MergeDataFile;
private:
ByteString sHelpText; // empty string
ByteStringHashMap sText;
ByteStringBoolHashMap bTextFirst;
ByteStringHashMap sQuickHelpText;
ByteStringBoolHashMap bQuickHelpTextFirst;
ByteStringHashMap sTitle;
ByteStringBoolHashMap bTitleFirst;
public:
PFormEntrys( const ByteString &rPForm ) : ByteString( rPForm ) {};
ByteString Dump();
void InsertEntry(
const ByteString &nId ,
const ByteString &rText,
const ByteString &rQuickHelpText,
const ByteString &rTitle
)
{
sText[ nId ] = rText;
bTextFirst[ nId ] = true;
sQuickHelpText[ nId ] = rQuickHelpText;
bQuickHelpTextFirst[ nId ] = true;
sTitle[ nId ] = rTitle;
bTitleFirst[ nId ] = true;
}
sal_Bool GetText( ByteString &rReturn, sal_uInt16 nTyp, const ByteString &nLangIndex, sal_Bool bDel = sal_False );
sal_Bool GetTransex3Text( ByteString &rReturn, sal_uInt16 nTyp, const ByteString &nLangIndex, sal_Bool bDel = sal_False );
};
//
// class MergeData
//
/******************************************************************************
* Purpose: holds information of data to merge (one ressource)
******************************************************************************/
class MergeDataFile;
class MergeData
{
friend class MergeDataFile;
private:
ByteString sTyp;
ByteString sGID;
ByteString sLID;
ByteString sFilename;
PFormEntrysHashMap aMap;
public:
MergeData( const ByteString &rTyp, const ByteString &rGID, const ByteString &rLID , const ByteString &rFilename )
: sTyp( rTyp ), sGID( rGID ), sLID( rLID ) , sFilename( rFilename ) {};
~MergeData();
PFormEntrys* GetPFormEntries();
void Insert( PFormEntrys* pfEntrys );
PFormEntrys* GetPFObject( const ByteString& rPFO );
ByteString Dump();
sal_Bool operator==( ResData *pData );
};
//
// class MergeDataFile
//
/******************************************************************************
* Purpose: holds information of data to merge
******************************************************************************/
class MergeDataFile
{
private:
sal_Bool bErrorLog;
ByteString sErrorLog;
SvFileStream aErrLog;
MergeDataHashMap aMap;
std::set<ByteString> aLanguageSet;
MergeData *GetMergeData( ResData *pResData , bool bCaseSensitve = false );
void InsertEntry( const ByteString &rTYP, const ByteString &rGID, const ByteString &rLID,
const ByteString &rPFO,
const ByteString &nLang, const ByteString &rTEXT,
const ByteString &rQHTEXT, const ByteString &rTITLE,
const ByteString &sFilename, bool bCaseSensitive
);
ByteString Dump();
public:
explicit MergeDataFile( const ByteString &rFileName, const ByteString& rFile, bool bErrLog, bool bCaseSensitive = false );
~MergeDataFile();
std::vector<ByteString> GetLanguages();
PFormEntrys *GetPFormEntrys( ResData *pResData );
PFormEntrys *GetPFormEntrysCaseSensitive( ResData *pResData );
static ByteString CreateKey( const ByteString& rTYP , const ByteString& rGID , const ByteString& rLID , const ByteString& rFilename , bool bCaseSensitive = false );
};
class QueueEntry
{
public:
QueueEntry( int nTypVal , ByteString sLineVal ): nTyp( nTypVal ) , sLine( sLineVal ){};
int nTyp;
ByteString sLine;
};
class ParserQueue
{
public:
ParserQueue( Export& aExportObj );
~ParserQueue();
inline void Push( const QueueEntry& aEntry );
bool bCurrentIsM; // public ?
bool bNextIsM; // public ?
bool bLastWasM; // public ?
bool bMflag; // public ?
void Close();
private:
// Future / Next
std::queue<QueueEntry>* aQueueNext;
// Current
std::queue<QueueEntry>* aQueueCur;
// Ref
std::queue<QueueEntry>* aQref;
Export& aExport;
bool bStart;
bool bStartNext;
inline void Pop( std::queue<QueueEntry>& aQueue );
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */