/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _EXPORT_HXX #define _EXPORT_HXX #include #include // #define MERGE_SOURCE_LANGUAGES <- To merge en-US and de resource #include #include #include #include #include #include #include /* std::hashmap*/ #include /* std::iterator*/ #include /* std::set*/ #include /* std::vector*/ #include #include #include #ifdef WNT #include #endif #define NO_TRANSLATE_ISO "x-no-translate" #define JAPANESE_ISO "ja" class PFormEntrys; class MergeData; typedef std::set ByteStringSet; typedef std::hash_map ByteStringHashMap; typedef std::hash_map ByteStringBoolHashMap; typedef std::hash_map PFormEntrysHashMap; typedef std::hash_map MergeDataHashMap; #define SOURCE_LANGUAGE ByteString("en-US") #define LIST_REFID "LIST_REFID" typedef ByteStringHashMap ExportListEntry; DECLARE_LIST( ExportListBase, ExportListEntry * ) // // class ExportList // class ExportList : public ExportListBase { private: sal_uLong nSourceLanguageListEntryCount; public: ExportList() : ExportListBase() { nSourceLanguageListEntryCount = 0; } sal_uLong GetSourceLanguageListEntryCount() { return nSourceLanguageListEntryCount; } void NewSourceLanguageListEntry() { nSourceLanguageListEntryCount++; } }; #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 ByteString &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; ByteStringHashMap aFallbackData; ByteStringHashMap aMergedLanguages; ExportList *pStringList; ExportList *pUIEntries; ExportList *pItemList; ExportList *pFilterList; ExportList *pPairedList; ByteString sPForm; void Dump(); void addFallbackData( ByteString& sId , const ByteString& sText ); bool getFallbackData( ByteString& sId , ByteString& sText); void addMergedLanguage( ByteString& sLang ); bool isMerged( ByteString& sLang ); 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.EraseAllChars( '\r' ); sPForm.EraseAllChars( '\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.EraseAllChars( '\r' ); sPForm.EraseAllChars( '\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 DECLARE_LIST( ResStack, ResData * ) // forwards class WordTransformer; class ParserQueue; class Export { private: WordTransformer *pWordTransformer; CharSet aCharSet; // used charset in src 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 ByteString nListLang; 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 ByteString sLanguages; // public ? static ByteString sForcedLanguages; // public ? static bool skipProject( ByteString sPrj ) ; static void InitLanguages( bool bMergeMode = false ); static void InitForcedLanguages( bool bMergeMode = false ); static std::vector GetLanguages(); static std::vector GetForcedLanguages(); static void SetLanguages( std::vector val ); static void RemoveUTF8ByteOrderMarker( ByteString &rString ); static bool hasUTF8ByteOrderMarker( const ByteString &rString ); static void RemoveUTF8ByteOrderMarkerFromFile( const ByteString &rFilename ); static bool fileHasUTF8ByteOrderMarker( const ByteString &rString ); static ByteString GetIsoLangByIndex( sal_uInt16 nIndex ); static void QuotHTML( ByteString &rString ); static bool CopyFile( const ByteString& source , const ByteString& dest ); static void QuotHTMLXRM( ByteString &rString ); static void UnquotHTML( ByteString &rString ); static const char* GetEnv( const char *pVar ); static int getCurrentDirectory( rtl::OUString& base_fqurl , rtl::OUString& base ); static bool isSourceLanguage( const ByteString &sLanguage ); static bool isAllowed( const ByteString &sLanguage ); static bool LanguageAllowed( const ByteString &nLanguage ); static void Languages( std::vector::const_iterator& begin , std::vector::const_iterator& end ); static void getRandomName( const ByteString& sPrefix , ByteString& sRandStr , const ByteString& sPostfix ); static void getRandomName( ByteString& sRandStr ); static void getCurrentDir( std::string& dir ); static void replaceEncoding( ByteString& rString ); static ByteString GetFallbackLanguage( const ByteString nLanguage ); static void FillInFallbacks( ResData *pResData ); static void FillInListFallbacks( ExportList *pList, const ByteString &nSource, const ByteString &nFallback ); static ByteString GetTimeStamp(); static sal_Bool ConvertLineEnds( ByteString sSource, ByteString sDestination ); static ByteString GetNativeFile( ByteString sSource ); static DirEntry GetTempFile(); static void DumpExportList( ByteString& sListName , ExportList& aList ); static ByteString DumpMap( ByteString& sMapName , ByteStringHashMap& aMap ); private: static std::vector aLanguages; static std::vector aForcedLanguages; sal_Bool ListExists( ResData *pResData, sal_uInt16 nLst ); 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 bool PairedListFallback( ByteString& sText , ResData& aResData ); ByteString GetPairedListID ( const ByteString& sText ); ByteString GetPairedListString ( const ByteString& sText ); ByteString StripList ( const ByteString& sText ); void UnmergeUTF8( ByteString& sOrig ); 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, ByteString &nLangIndex, 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* InsertEntry( const ByteString &rPForm ); PFormEntrys* GetPFormEntrys( ResData *pResData ); void Insert( const ByteString& rPFO , 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 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(); void WriteError( const ByteString &rLine ); public: MergeDataFile( const ByteString &rFileName, const ByteString& rFile , sal_Bool bErrLog, CharSet aCharSet, bool bCaseSensitive = false ); ~MergeDataFile(); std::vector 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* aQueueNext; // Current std::queue* aQueueCur; // Ref std::queue* aQref; Export& aExport; bool bStart; bool bStartNext; inline void Pop( std::queue& aQueue ); }; #endif