summaryrefslogtreecommitdiff
path: root/soldep/bootstrp/prj.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'soldep/bootstrp/prj.cxx')
-rw-r--r--soldep/bootstrp/prj.cxx2875
1 files changed, 2875 insertions, 0 deletions
diff --git a/soldep/bootstrp/prj.cxx b/soldep/bootstrp/prj.cxx
new file mode 100644
index 000000000000..36495a429de8
--- /dev/null
+++ b/soldep/bootstrp/prj.cxx
@@ -0,0 +1,2875 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+#include <stdlib.h>
+#include <stdio.h>
+#include <bootstrp/sstring.hxx>
+#include <vos/mutex.hxx>
+
+#define ENABLE_BYTESTRING_STREAM_OPERATORS
+#include <tools/stream.hxx>
+#include <tools/geninfo.hxx>
+#include <soldep/prj.hxx>
+#include <bootstrp/inimgr.hxx>
+
+#ifndef MACOSX
+#pragma hdrstop
+#endif
+
+//#define TEST 1
+
+#if defined(WNT) || defined(OS2)
+#define LIST_DELIMETER ';'
+#else
+#ifdef UNX
+#define LIST_DELIMETER ':'
+#else
+#endif
+#endif
+
+#if defined(WNT) || defined(OS2)
+#define PATH_DELIMETER '\\'
+#else
+#ifdef UNX
+#define PATH_DELIMETER '/'
+#else
+#endif
+#endif
+
+//static const char * XML_ALL = "all";
+
+//
+// class SimpleConfig
+//
+
+/*****************************************************************************/
+SimpleConfig::SimpleConfig( String aSimpleConfigFileName )
+/*****************************************************************************/
+{
+ nLine = 0;
+ aFileName = aSimpleConfigFileName;
+ aFileStream.Open ( aFileName, STREAM_READ );
+}
+
+/*****************************************************************************/
+SimpleConfig::SimpleConfig( DirEntry& rDirEntry )
+/*****************************************************************************/
+{
+ nLine = 0;
+ aFileName = rDirEntry.GetFull();
+ aFileStream.Open ( aFileName, STREAM_READ );
+}
+
+/*****************************************************************************/
+SimpleConfig::~SimpleConfig()
+/*****************************************************************************/
+{
+ aFileStream.Close ();
+}
+
+/*****************************************************************************/
+ByteString SimpleConfig::GetNext()
+/*****************************************************************************/
+{
+ ByteString aString;
+
+ if ( aStringBuffer =="" )
+ while ((aStringBuffer = GetNextLine()) == "\t"); //solange bis != "\t"
+ if ( aStringBuffer =="" )
+ return ByteString();
+
+ aString = aStringBuffer.GetToken(0,'\t');
+ aStringBuffer.Erase(0, aString.Len()+1);
+
+ aStringBuffer.EraseLeadingChars( '\t' );
+
+ return aString;
+}
+
+/*****************************************************************************/
+ByteString SimpleConfig::GetNextLine()
+/*****************************************************************************/
+{
+ ByteString aSecStr;
+ sal_Bool bStreamOk;
+// USHORT iret = 0;
+ nLine++;
+
+ bStreamOk = aFileStream.ReadLine ( aTmpStr );
+ if ( (aTmpStr.Search( "#" ) == 0) )
+ return "\t";
+ aTmpStr = aTmpStr.EraseLeadingChars();
+ aTmpStr = aTmpStr.EraseTrailingChars();
+ while ( aTmpStr.SearchAndReplace(ByteString(' '),ByteString('\t') ) != STRING_NOTFOUND );
+ int nLength = aTmpStr.Len();
+ if ( bStreamOk && (nLength == 0) )
+ return "\t";
+// USHORT nPos = 0;
+ BOOL bFound = FALSE;
+ ByteString aEraseString;
+ for ( USHORT i = 0; i<= nLength; i++)
+ {
+ if ( aTmpStr.GetChar( i ) == 0x20 && !bFound )
+ aTmpStr.SetChar( i, 0x09 );
+ }
+ return aTmpStr;
+}
+
+/*****************************************************************************/
+ByteString SimpleConfig::GetCleanedNextLine( BOOL bReadComments )
+/*****************************************************************************/
+{
+ sal_Bool bStreamOk;
+ sal_Bool bReadNextLine = sal_True;
+ while (bReadNextLine)
+ {
+ bStreamOk = aFileStream.ReadLine ( aTmpStr );
+ if (!bStreamOk)
+ return ByteString();
+
+ ByteString sTab = "\t";
+ ByteString sDoubleTab = "\t\t";
+ ByteString sSpace = " ";
+ xub_StrLen nIndex = 0;
+
+ aTmpStr.SearchAndReplaceAll(sSpace, sTab);
+ while ( (nIndex = aTmpStr.SearchAndReplace(sDoubleTab, sTab, nIndex )) != STRING_NOTFOUND );
+
+ aTmpStr = aTmpStr.EraseLeadingAndTrailingChars('\t'); // remove tabs
+
+ if ( aTmpStr.Search( "#" ) == 0 )
+ {
+ if (bReadComments )
+ return aTmpStr;
+ }
+ else if (aTmpStr != ByteString::EmptyString())
+ bReadNextLine = sal_False;
+ }
+
+ return aTmpStr;
+}
+
+
+//
+// class CommandData
+//
+
+/*****************************************************************************/
+CommandData::CommandData()
+/*****************************************************************************/
+{
+ nOSType = 0;
+ nCommand = 0;
+ pDepList = 0;
+ pCommandList = 0;
+}
+
+/*****************************************************************************/
+CommandData::~CommandData()
+/*****************************************************************************/
+{
+ if ( pDepList )
+ {
+ ByteString *pString = pDepList->First();
+ while ( pString )
+ {
+ delete pString;
+ pString = pDepList->Next();
+ }
+ delete pDepList;
+
+ pDepList = NULL;
+ }
+ if ( pCommandList )
+ {
+ ByteString *pString = pCommandList->First();
+ while ( pString )
+ {
+ delete pString;
+ pString = pCommandList->Next();
+ }
+ delete pCommandList;
+
+ pCommandList = NULL;
+ }
+}
+
+/*****************************************************************************/
+ByteString CommandData::GetOSTypeString()
+/*****************************************************************************/
+{
+ ByteString aRetStr;
+
+ switch (nOSType)
+ {
+ case OS_WIN16 | OS_WIN32 | OS_OS2 | OS_UNX | OS_MAC :
+ aRetStr = "all";
+ break;
+ case OS_WIN32 | OS_WIN16 :
+ aRetStr = "w";
+ break;
+ case OS_OS2 :
+ aRetStr = "p";
+ break;
+ case OS_UNX :
+ aRetStr = "u";
+ break;
+ case OS_WIN16 :
+ aRetStr = "d";
+ break;
+ case OS_WIN32 :
+ aRetStr = "n";
+ break;
+ case OS_MAC :
+ aRetStr = "m";
+ break;
+ default :
+ aRetStr = "none";
+ }
+
+ return aRetStr;
+}
+
+/*****************************************************************************/
+ByteString CommandData::GetCommandTypeString()
+/*****************************************************************************/
+{
+ ByteString aRetStr;
+
+ switch (nCommand)
+ {
+ case COMMAND_NMAKE :
+ aRetStr = "nmake";
+ break;
+ case COMMAND_GET :
+ aRetStr = "get";
+ break;
+ default :
+ aRetStr = "usr";
+ aRetStr += ByteString::CreateFromInt64( nCommand + 1 - COMMAND_USER_START );
+
+ }
+
+ return aRetStr;
+}
+
+/*****************************************************************************/
+void CommandData::AddCommand(ByteString* pCommand)
+/*****************************************************************************/
+{
+ if (!pCommandList)
+ pCommandList = new SByteStringList();
+ pCommandList->Insert(pCommand, LIST_APPEND);
+}
+
+/*****************************************************************************/
+CommandData& CommandData::operator>> ( SvStream& rStream )
+/*****************************************************************************/
+{
+ rStream << aPrj;
+ rStream << aLogFileName;
+ rStream << aInpath;
+ rStream << aUpd;
+ rStream << aUpdMinor;
+ rStream << aProduct;
+ rStream << aCommand;
+ rStream << aPath;
+ rStream << aPrePath;
+ rStream << aPreFix;
+ rStream << aCommandPara;
+ rStream << aComment;
+ rStream << sClientRestriction;
+
+ rStream << nOSType;
+ rStream << nCommand;
+ rStream << nDepth;
+
+ if (pDepList)
+ {
+ rStream << sal_True;
+ *pDepList >> rStream;
+ }
+ else
+ rStream << sal_False;
+
+ if (pCommandList)
+ {
+ rStream << sal_True;
+ *pCommandList >> rStream;
+ }
+ else
+ rStream << sal_False;
+
+ return *this;
+}
+
+/*****************************************************************************/
+CommandData& CommandData::operator<< ( SvStream& rStream )
+/*****************************************************************************/
+{
+ rStream >> aPrj;
+ rStream >> aLogFileName;
+ rStream >> aInpath;
+ rStream >> aUpd;
+ rStream >> aUpdMinor;
+ rStream >> aProduct;
+ rStream >> aCommand;
+ rStream >> aPath;
+ rStream >> aPrePath;
+ rStream >> aPreFix;
+ rStream >> aCommandPara;
+ rStream >> aComment;
+ rStream >> sClientRestriction;
+
+ rStream >> nOSType;
+ rStream >> nCommand;
+ rStream >> nDepth;
+
+ BOOL bDepList;
+ rStream >> bDepList;
+ if (pDepList)
+ pDepList->CleanUp();
+ if (bDepList)
+ {
+ if (!pDepList)
+ pDepList = new SByteStringList();
+ *pDepList << rStream;
+ }
+ else
+ {
+ if (pDepList)
+ DELETEZ (pDepList);
+ }
+
+ BOOL bCommandList;
+ rStream >> bCommandList;
+ if (pCommandList)
+ pCommandList->CleanUp();
+ if (bCommandList)
+ {
+ if (!pCommandList)
+ pCommandList = new SByteStringList();
+ *pCommandList << rStream;
+ }
+ else
+ {
+ if (pCommandList)
+ DELETEZ (pCommandList);
+ }
+
+ return *this;
+}
+
+
+
+//
+// class DepInfo
+//
+
+/*****************************************************************************/
+DepInfo::~DepInfo()
+/*****************************************************************************/
+{
+ RemoveProject();
+
+ if ( pModeList )
+ {
+ ByteString *pString = pModeList->First();
+ while ( pString )
+ {
+ delete pString;
+ pString = pModeList->Next();
+ }
+ delete pModeList;
+
+ pModeList = NULL;
+ }
+}
+
+/*****************************************************************************/
+void DepInfo::SetProject (ByteString* pStr)
+/*****************************************************************************/
+{
+ RemoveProject();
+ pProject = pStr;
+}
+
+/*****************************************************************************/
+void DepInfo::RemoveProject ()
+/*****************************************************************************/
+{
+ if (pProject)
+ {
+ delete pProject;
+ pProject = NULL;
+ }
+}
+
+/*****************************************************************************/
+DepInfo& DepInfo::operator<< ( SvStream& rStream )
+/*****************************************************************************/
+{
+ RemoveProject();
+ pProject = new ByteString();
+ rStream >> *pProject;
+
+ BOOL bModeList;
+ rStream >> bModeList;
+ if (pModeList)
+ pModeList->CleanUp();
+ if (bModeList)
+ {
+ if (!pModeList)
+ pModeList = new SByteStringList();
+ *pModeList << rStream;
+ }
+ else
+ DELETEZ (pModeList);
+
+ rStream >> bAllModes;
+ return *this;
+}
+
+/*****************************************************************************/
+DepInfo& DepInfo::operator>> ( SvStream& rStream )
+/*****************************************************************************/
+{
+ rStream << *pProject;
+ if (pModeList)
+ {
+ rStream << sal_True;
+ *pModeList >> rStream;
+ }
+ else
+ rStream << sal_False;
+ rStream << bAllModes;
+
+ return *this;
+}
+
+//
+// class SDepInfoList
+//
+
+/*****************************************************************************/
+SDepInfoList::SDepInfoList()
+/*****************************************************************************/
+ : pAllModeList(0)
+{
+}
+
+/*****************************************************************************/
+SDepInfoList::~SDepInfoList()
+/*****************************************************************************/
+{
+ if (pAllModeList)
+ delete pAllModeList;
+}
+
+/*****************************************************************************/
+ULONG SDepInfoList::IsString( ByteString* pStr )
+/*****************************************************************************/
+{
+ ULONG nRet = NOT_THERE;
+ if ( (nRet = GetPrevString( pStr )) != 0 )
+ {
+ ByteString* pString = GetObject( nRet )->GetProject();
+ if ( *pString == *pStr )
+ return nRet;
+ else
+ return NOT_THERE;
+ }
+ else
+ {
+ ByteString* pString = GetObject( 0 )->GetProject();
+ if ( pString && (*pString == *pStr) )
+ return 0;
+ else
+ return NOT_THERE;
+ }
+ return nRet;
+}
+
+/*****************************************************************************/
+ULONG SDepInfoList::GetPrevString( ByteString* pStr )
+/*****************************************************************************/
+{
+ ULONG nRet = 0;
+ BOOL bFound = FALSE;
+ ULONG nCount_l = Count();
+ ULONG nUpper = nCount_l;
+ ULONG nLower = 0;
+ ULONG nCurrent = nUpper / 2;
+ ULONG nRem = 0;
+ ByteString* pString;
+
+ do
+ {
+ if ( (nCurrent == nLower) || (nCurrent == nUpper) )
+ return nLower;
+ pString = GetObject( nCurrent )->GetProject();
+ int nResult = pStr->CompareTo( *pString );
+ if ( nResult == COMPARE_LESS )
+ {
+ nUpper = nCurrent;
+ nCurrent = (nCurrent + nLower) /2;
+ }
+ else if ( nResult == COMPARE_GREATER )
+ {
+ nLower = nCurrent;
+ nCurrent = (nUpper + nCurrent) /2;
+ }
+ else if ( nResult == COMPARE_EQUAL )
+ return nCurrent;
+ if ( nRem == nCurrent )
+ return nCurrent;
+ nRem = nCurrent;
+ }
+ while ( !bFound );
+ return nRet;
+}
+
+/*****************************************************************************/
+void SDepInfoList::PutModeString( DepInfo* pInfoList, ByteString* pStr )
+/*****************************************************************************/
+{
+ SByteStringList* pList = pInfoList->GetModeList();
+ if (!pList)
+ {
+ pList = new SByteStringList;
+ pInfoList->SetModeList(pList);
+
+ }
+
+ if (pList)
+ {
+ // check if string exists
+ ByteString *pString = pList->First();
+ while ( pString )
+ {
+ if (*pString == *pStr)
+ {
+ delete pStr;
+ return;
+ }
+ pString = pList->Next();
+ }
+ pList->PutString( pStr );
+ }
+ else
+ delete pStr;
+}
+
+/*****************************************************************************/
+ULONG SDepInfoList::PutString( ByteString* pStr)
+/*****************************************************************************/
+{
+ return PutString( pStr, NULL);
+}
+
+/**************************************************************************
+*
+* Sortiert einen ByteString in die Liste ein und gibt die Position,
+* an der einsortiert wurde, zurueck
+*
+**************************************************************************/
+
+ULONG SDepInfoList::PutString( ByteString* pStr, ByteString* pModeStr)
+{
+ if (pAllModeList)
+ {
+ delete pAllModeList;
+ pAllModeList = NULL;
+ }
+
+ ULONG nPos = GetPrevString ( pStr );
+ if ( Count() )
+ {
+ {
+ DepInfo* pInfo = GetObject( 0 );
+ ByteString* pString = pInfo->GetProject();
+ if ( pString->CompareTo( *pStr ) == COMPARE_GREATER )
+ {
+ pInfo = new DepInfo;
+ if (pInfo)
+ {
+ pInfo->SetProject(pStr);
+ if (pModeStr)
+ PutModeString(pInfo, pModeStr);
+ else
+ pInfo->SetAllModes();
+ Insert( pInfo, (ULONG)0 );
+ }
+ return (ULONG)0;
+ }
+ }
+ ByteString* pString = GetObject( nPos )->GetProject();
+ if ( *pStr != *pString )
+ {
+ DepInfo* pInfo = new DepInfo;
+ if (pInfo)
+ {
+ pInfo->SetProject(pStr);
+ if (pModeStr)
+ PutModeString(pInfo, pModeStr);
+ else
+ pInfo->SetAllModes();
+ Insert( pInfo, nPos+1 );
+ }
+ return ( nPos +1 );
+ }
+ else
+ {
+ delete pStr;
+ DepInfo* pInfo = GetObject( nPos );
+ if (pModeStr)
+ PutModeString(pInfo, pModeStr);
+ else
+ pInfo->SetAllModes();
+ return ( nPos +1 );
+ }
+ }
+ else
+ {
+ DepInfo* pInfo = new DepInfo;
+ if (pInfo)
+ {
+ pInfo->SetProject(pStr);
+ if (pModeStr)
+ PutModeString(pInfo, pModeStr);
+ else
+ pInfo->SetAllModes();
+ Insert( pInfo);
+ return (ULONG)0;
+ }
+ }
+
+ delete pStr;
+ if (pModeStr)
+ delete pModeStr;
+ return NOT_THERE;
+}
+
+/*****************************************************************************/
+ByteString* SDepInfoList::RemoveString( const ByteString& rName )
+/*****************************************************************************/
+{
+ ULONG i;
+ ByteString* pReturn;
+ if (pAllModeList)
+ {
+ delete pAllModeList;
+ pAllModeList = NULL;
+ }
+
+ for( i = 0 ; i < Count(); i++ )
+ {
+ if ( rName == *(GetObject( i )->GetProject()) )
+ {
+ pReturn = new ByteString(*(GetObject(i)->GetProject()));
+ DepInfo* pInfo;
+ pInfo = GetObject(i);
+ delete pInfo;
+ Remove(i);
+ return pReturn;
+ }
+ }
+
+ return NULL;
+}
+
+/*****************************************************************************/
+SByteStringList* SDepInfoList::GetAllDepModes()
+/*****************************************************************************/
+{
+ if (pAllModeList)
+ return pAllModeList;
+
+ DepInfo *pInfo = First();
+ while ( pInfo )
+ {
+ if (!pInfo->IsAllModes() && pInfo->GetModeList())
+ {
+ if (!pAllModeList)
+ pAllModeList = new SByteStringList();
+ ByteString* pStr = pInfo->GetModeList()->First();
+ while (pStr)
+ {
+ if (pAllModeList->IsString(pStr) == NOT_THERE)
+ pAllModeList->PutString(pStr);
+ pStr = pInfo->GetModeList()->Next();
+ }
+ }
+ pInfo = Next();
+ }
+ return pAllModeList;
+}
+
+/*****************************************************************************/
+SDepInfoList& SDepInfoList::operator<< ( SvStream& rStream )
+/*****************************************************************************/
+{
+ ULONG nCount_l;
+ rStream >> nCount_l;
+ for ( USHORT i = 0; i < nCount_l; i++ ) {
+ DepInfo* pDepInfo = new DepInfo();
+ *pDepInfo << rStream;
+ Insert (pDepInfo, LIST_APPEND);
+ }
+ return *this;
+}
+
+/*****************************************************************************/
+SDepInfoList& SDepInfoList::operator>> ( SvStream& rStream )
+/*****************************************************************************/
+{
+ ULONG nCount_l = Count();
+ rStream << nCount_l;
+ DepInfo* pDepInfo = First();
+ while (pDepInfo) {
+ *pDepInfo >> rStream;
+ pDepInfo = Next();
+ }
+
+ return *this;
+}
+
+/*****************************************************************************/
+CommandData* Prj::GetDirectoryList ( USHORT nWhatOS, USHORT nCommand )
+/*****************************************************************************/
+{
+ return (CommandData *)NULL;
+}
+
+/*****************************************************************************/
+CommandData* Prj::GetDirectoryData( ByteString aLogFileName )
+/*****************************************************************************/
+{
+ PrjList* pPrjList = GetCommandDataList ();
+ CommandData *pData = NULL;
+ ULONG nCount_l = pPrjList->Count();
+ for ( ULONG i=0; i<nCount_l; i++ )
+ {
+ pData = pPrjList->GetObject(i);
+ if ( pData->GetLogFile() == aLogFileName )
+ return pData;
+ }
+ return NULL;
+}
+
+//
+// class Prj
+//
+
+/*****************************************************************************/
+Prj::Prj() :
+ pPrjInitialDepList(0),
+ pPrjDepList(0),
+ pPrjDepInfoList(0),
+ bSorted( FALSE ),
+ bHardDependencies( FALSE ),
+ bFixedDependencies( FALSE ),
+ bVisited( FALSE ),
+ bIsAvailable( TRUE ),
+ pTempCommandDataList (0),
+ bTempCommandDataListPermanent (FALSE),
+ bError (FALSE)
+/*****************************************************************************/
+{
+}
+
+/*****************************************************************************/
+Prj::Prj( ByteString aName ) :
+ aProjectName( aName ),
+ pPrjInitialDepList(0),
+ pPrjDepList(0),
+ pPrjDepInfoList(0),
+ bSorted( FALSE ),
+ bHardDependencies( FALSE ),
+ bFixedDependencies( FALSE ),
+ bVisited( FALSE ),
+ bIsAvailable( TRUE ),
+ pTempCommandDataList (0),
+ bTempCommandDataListPermanent (FALSE),
+ bError (FALSE)
+/*****************************************************************************/
+{
+}
+
+/*****************************************************************************/
+Prj::~Prj()
+/*****************************************************************************/
+{
+ pPrjDepList = RemoveStringList (pPrjDepList);
+ pPrjInitialDepList = RemoveStringList (pPrjInitialDepList);
+ pPrjDepInfoList = RemoveDepInfoList (pPrjDepInfoList);
+}
+
+/*****************************************************************************/
+SByteStringList* Prj::RemoveStringList(SByteStringList* pStringList )
+/*****************************************************************************/
+{
+ if ( pStringList )
+ {
+ ByteString *pString = pStringList->First();
+ while ( pString )
+ {
+ delete pString;
+ pString = pStringList->Next();
+ }
+
+ delete pStringList;
+
+ pStringList = NULL;
+ }
+ return pStringList;
+}
+
+/*****************************************************************************/
+SDepInfoList* Prj::RemoveDepInfoList(SDepInfoList* pInfoList )
+/*****************************************************************************/
+{
+ if ( pInfoList )
+ {
+ DepInfo *pInfo = pInfoList->First();
+ while ( pInfo )
+ {
+ delete pInfo;
+ pInfo = pInfoList->Next();
+ }
+
+ delete pInfoList;
+
+ pInfoList = NULL;
+ }
+ return pInfoList;
+}
+
+/*****************************************************************************/
+void Prj::AddDependencies( ByteString aStr )
+/*****************************************************************************/
+{
+
+ if ( !pPrjDepInfoList )
+ pPrjDepInfoList = new SDepInfoList;
+
+ pPrjDepInfoList->PutString( new ByteString(aStr) );
+}
+
+/*****************************************************************************/
+void Prj::AddDependencies( ByteString aStr, ByteString aModeStr )
+/*****************************************************************************/
+{
+
+ // needs dirty flag - not expanded
+ if ( !pPrjDepInfoList )
+ pPrjDepInfoList = new SDepInfoList;
+
+ pPrjDepInfoList->PutString( new ByteString(aStr), new ByteString(aModeStr) );
+}
+
+/*****************************************************************************/
+SByteStringList* Prj::GetDependencies( BOOL bExpanded )
+/*****************************************************************************/
+{
+ if ( bExpanded )
+ {
+ if (!pPrjDepList)
+ SetMode (NULL);
+ return pPrjDepList;
+ }
+ else
+ {
+ if (!pPrjInitialDepList)
+ SetMode (NULL);
+ return pPrjInitialDepList;
+ }
+}
+
+/*****************************************************************************/
+void Prj::SetMode(SByteStringList* pModList)
+/*****************************************************************************/
+{
+ pPrjDepList = RemoveStringList (pPrjDepList);
+ pPrjInitialDepList = RemoveStringList (pPrjInitialDepList);
+
+ if (!pPrjDepInfoList)
+ return;
+
+ pPrjDepList = new SByteStringList;
+ pPrjInitialDepList = new SByteStringList;
+
+ DepInfo *pInfo = pPrjDepInfoList->First();
+ while ( pInfo )
+ {
+ if (pInfo->IsAllModes() || !pInfo->GetModeList() || !pModList)
+ {
+ pPrjDepList->PutString( new ByteString((ByteString) *(pInfo->GetProject())));
+ pPrjInitialDepList->PutString( new ByteString((ByteString) *(pInfo->GetProject())));
+ //pPrjDepList->PutString( pInfo->GetProject());
+ //pPrjInitialDepList->PutString( pInfo->GetProject());
+ }
+ else
+ {
+ BOOL bStringFound = FALSE;
+ SByteStringList * pDepList = pInfo->GetModeList();
+ ByteString *pModString = pDepList->First();
+ while ( pModString )
+ {
+ ByteString *pDefModString = pModList->First();
+ while ( pDefModString )
+ {
+ if (*pDefModString == *pModString)
+ {
+ pPrjDepList->PutString( new ByteString((ByteString) *(pInfo->GetProject())));
+ pPrjInitialDepList->PutString( new ByteString((ByteString) *(pInfo->GetProject())));
+ //pPrjDepList->PutString( pInfo->GetProject());
+ //pPrjInitialDepList->PutString( pInfo->GetProject());
+ bStringFound = TRUE;
+ break;
+ }
+ pDefModString = pModList->Next();
+ }
+ if (bStringFound)
+ break;
+ pModString = pDepList->Next();
+ }
+
+ }
+
+ pInfo = pPrjDepInfoList->Next();
+ }
+}
+
+/*****************************************************************************/
+BOOL Prj::InsertDirectory ( ByteString aDirName, USHORT aWhat,
+ USHORT aWhatOS, ByteString aLogFileName,
+ const ByteString &rClientRestriction )
+/*****************************************************************************/
+{
+ CommandData* pData = new CommandData();
+
+ pData->SetPath( aDirName );
+ pData->SetCommandType( aWhat );
+ pData->SetOSType( aWhatOS );
+ pData->SetLogFile( aLogFileName );
+ pData->SetClientRestriction( rClientRestriction );
+
+ PrjList* pPrjList = GetCommandDataList ();
+ pPrjList->Insert( pData );
+
+ return FALSE;
+}
+
+/*****************************************************************************/
+//
+// removes directory and existing dependencies on it
+//
+CommandData* Prj::RemoveDirectory ( ByteString aLogFileName )
+/*****************************************************************************/
+{
+ PrjList* pPrjList = GetCommandDataList ();
+ ULONG nCount_l = pPrjList->Count();
+ CommandData* pData;
+ CommandData* pDataFound = NULL;
+ SByteStringList* pDataDeps;
+
+ for ( USHORT i = 0; i < nCount_l; i++ )
+ {
+ pData = pPrjList->GetObject( i );
+ if ( pData->GetLogFile() == aLogFileName )
+ pDataFound = pData;
+ else
+ {
+ pDataDeps = pData->GetDependencies();
+ if ( pDataDeps )
+ {
+ ByteString* pString;
+ ULONG nDataDepsCount = pDataDeps->Count();
+ for ( ULONG j = nDataDepsCount; j > 0; j-- )
+ {
+ pString = pDataDeps->GetObject( j - 1 );
+ if ( pString->GetToken( 0, '.') == aLogFileName )
+ pDataDeps->Remove( pString );
+ }
+ }
+ }
+ }
+
+ Remove( pDataFound );
+
+ return pDataFound;
+}
+
+/*****************************************************************************/
+void Prj::ExtractDependencies()
+/*****************************************************************************/
+{
+ ULONG nPos = 0;
+ CommandData* pData = GetObject(nPos);
+ while (pData)
+ {
+ SByteStringList* pDepList = pData->GetDependencies();
+ if (pDepList)
+ {
+ ByteString * pDepStr = pDepList->First();
+ while (pDepStr)
+ {
+ CommandData* pSearchData = First();
+ while (pSearchData)
+ {
+ if ((*pDepStr == pSearchData->GetPath()) && (pData->GetOSType() & pSearchData->GetOSType()))
+ {
+ *pDepStr = pSearchData->GetLogFile();
+ break;
+ }
+
+ pSearchData = Next();
+ }
+
+ pDepStr = pDepList->Next();
+ }
+ }
+ nPos ++;
+ pData = GetObject(nPos);
+ }
+}
+
+/*****************************************************************************/
+PrjList* Prj::GetCommandDataList ()
+/*****************************************************************************/
+{
+ if (pTempCommandDataList)
+ return pTempCommandDataList;
+ else
+ return (PrjList*)this;
+}
+
+/*****************************************************************************/
+void Prj::RemoveTempCommandDataList()
+/*****************************************************************************/
+{
+ if (pTempCommandDataList)
+ {
+ delete pTempCommandDataList; // this list remove the elements by itself
+ pTempCommandDataList = NULL;
+ }
+}
+
+/*****************************************************************************/
+void Prj::GenerateTempCommandDataList()
+/*****************************************************************************/
+{
+ if (pTempCommandDataList)
+ RemoveTempCommandDataList();
+ pTempCommandDataList = new PrjList();
+ CommandData* pCommandData = First();
+ while (pCommandData) {
+ SvMemoryStream* pStream = new SvMemoryStream();
+ *pCommandData >> *pStream;
+ CommandData* pNewCommandData = new CommandData();
+ pStream->Seek( STREAM_SEEK_TO_BEGIN );
+ *pNewCommandData << *pStream;
+ pTempCommandDataList->Insert(pNewCommandData, LIST_APPEND);
+ delete pStream;
+ pCommandData = Next();
+ }
+}
+
+/*****************************************************************************/
+void Prj::GenerateEmptyTempCommandDataList()
+/*****************************************************************************/
+{
+ if (pTempCommandDataList)
+ RemoveTempCommandDataList();
+ pTempCommandDataList = new PrjList();
+}
+
+/*****************************************************************************/
+Prj& Prj::operator>> ( SvStream& rStream )
+/*****************************************************************************/
+{
+ rStream << bVisited;
+ rStream << aProjectName;
+ rStream << aProjectPrefix;
+ rStream << bHardDependencies;
+ rStream << bFixedDependencies;
+ rStream << bSorted;
+ rStream << bIsAvailable;
+ rStream << bError;
+
+ if (pPrjDepInfoList)
+ {
+ rStream << sal_True;
+ *pPrjDepInfoList >> rStream;
+ }
+ else
+ rStream << sal_False;
+
+ ULONG nCount_l = Count();
+ rStream << nCount_l;
+
+ CommandData* pData = First();
+ while (pData) {
+ *pData >> rStream;
+ pData = Next();
+ }
+
+ return *this;
+}
+
+/*****************************************************************************/
+Prj& Prj::operator<< ( SvStream& rStream )
+/*****************************************************************************/
+{
+ rStream >> bVisited;
+ rStream >> aProjectName;
+ rStream >> aProjectPrefix;
+ rStream >> bHardDependencies;
+ rStream >> bFixedDependencies;
+ rStream >> bSorted;
+ rStream >> bIsAvailable;
+ rStream >> bError;
+
+ BOOL bDepList;
+ rStream >> bDepList;
+ DELETEZ (pPrjDepInfoList);
+ if (bDepList)
+ {
+ pPrjDepInfoList = new SDepInfoList();
+ *pPrjDepInfoList << rStream;
+ }
+
+ ULONG nCount_l;
+ rStream >> nCount_l;
+
+ for ( USHORT i = 0; i < nCount_l; i++ ) {
+ CommandData* pData = new CommandData();
+ *pData << rStream;
+ Insert (pData, LIST_APPEND);
+ }
+
+ return *this;
+}
+
+
+//
+// class Star
+//
+
+/*****************************************************************************/
+Star::Star()
+/*****************************************************************************/
+ : pDepMode (NULL),
+ pAllDepMode (NULL)
+{
+ // this ctor is only used by StarWriter
+}
+
+/*****************************************************************************/
+Star::Star(String aFileName, USHORT nMode )
+/*****************************************************************************/
+ : nStarMode( nMode ),
+ sFileName( aFileName ),
+ pDepMode (NULL),
+ pAllDepMode (NULL)
+{
+ Read( aFileName );
+}
+
+/*****************************************************************************/
+Star::Star(SolarFileList *pSolarFiles )
+/*****************************************************************************/
+ : nStarMode( STAR_MODE_MULTIPLE_PARSE ),
+ pDepMode (NULL),
+ pAllDepMode (NULL)
+{
+ // this ctor is used by StarBuilder to get the information for the whole workspace
+ Read( pSolarFiles );
+}
+
+/*****************************************************************************/
+Star::Star(GenericInformationList *pStandLst, ByteString &rVersion,
+ BOOL bLocal, const char *pSourceRoot )
+/*****************************************************************************/
+ : pDepMode (NULL),
+ pAllDepMode (NULL)
+{
+ UpdateFileList (pStandLst, rVersion, TRUE, bLocal, pSourceRoot);
+}
+
+/*****************************************************************************/
+void Star::UpdateFileList( GenericInformationList *pStandLst, ByteString &rVersion,
+ BOOL bRead, BOOL bLocal, const char *pSourceRoot )
+/*****************************************************************************/
+{
+ sSourceRoot=String::CreateFromAscii(""); // clear old SourceRoot
+ ByteString sPath( rVersion );
+ if ( pSourceRoot )
+ sSourceRoot = String::CreateFromAscii( pSourceRoot );
+
+#ifdef UNX
+ sPath += "/settings/UNXSOLARLIST";
+#else
+ sPath += "/settings/SOLARLIST";
+#endif
+ GenericInformation *pInfo = pStandLst->GetInfo( sPath, TRUE );
+
+ if( pInfo && pInfo->GetValue().Len()) {
+ ByteString sFile( pInfo->GetValue());
+ if ( bLocal ) {
+ IniManager aIniManager;
+ aIniManager.ToLocal( sFile );
+ }
+ String sFileName_l( sFile, RTL_TEXTENCODING_ASCII_US );
+ nStarMode = STAR_MODE_SINGLE_PARSE;
+ if (bRead)
+ Read( sFileName_l );
+ }
+ else {
+ SolarFileList *pFileList = new SolarFileList();
+
+ sPath = rVersion;
+ sPath += "/drives";
+
+ GenericInformation *pInfo_l = pStandLst->GetInfo( sPath, TRUE );
+ if ( pInfo_l && pInfo_l->GetSubList()) {
+ GenericInformationList *pDrives = pInfo_l->GetSubList();
+ for ( ULONG i = 0; i < pDrives->Count(); i++ ) {
+ GenericInformation *pDrive = pDrives->GetObject( i );
+ if ( pDrive ) {
+ DirEntry aEntry;
+ BOOL bOk = FALSE;
+ if ( sSourceRoot.Len()) {
+ aEntry = DirEntry( sSourceRoot );
+ bOk = TRUE;
+ }
+ else {
+#ifdef UNX
+ sPath = "UnixVolume";
+ GenericInformation *pUnixVolume = pDrive->GetSubInfo( sPath );
+ if ( pUnixVolume ) {
+ String sRoot( pUnixVolume->GetValue(), RTL_TEXTENCODING_ASCII_US );
+ aEntry = DirEntry( sRoot );
+ bOk = TRUE;
+ }
+#else
+ bOk = TRUE;
+ String sRoot( *pDrive, RTL_TEXTENCODING_ASCII_US );
+ sRoot += String::CreateFromAscii( "\\" );
+ aEntry = DirEntry( sRoot );
+#endif
+ }
+ if ( bOk ) {
+ sPath = "projects";
+ GenericInformation *pProjectsKey = pDrive->GetSubInfo( sPath, TRUE );
+ if ( pProjectsKey ) {
+ if ( !sSourceRoot.Len()) {
+ sPath = rVersion;
+ sPath += "/settings/PATH";
+ GenericInformation *pPath = pStandLst->GetInfo( sPath, TRUE );
+ if( pPath ) {
+ ByteString sAddPath( pPath->GetValue());
+#ifdef UNX
+ sAddPath.SearchAndReplaceAll( "\\", "/" );
+#else
+ sAddPath.SearchAndReplaceAll( "/", "\\" );
+#endif
+ String ssAddPath( sAddPath, RTL_TEXTENCODING_ASCII_US );
+ aEntry += DirEntry( ssAddPath );
+ }
+ }
+ sPath = rVersion;
+ sPath += "/settings/SHORTPATH";
+ GenericInformation *pShortPath = pStandLst->GetInfo( sPath, TRUE );
+ BOOL bShortPath = FALSE;
+ if (pShortPath && (pShortPath->GetValue() == "_TRUE"))
+ bShortPath = TRUE;
+ sSourceRoot = aEntry.GetFull();
+ GenericInformationList *pProjects = pProjectsKey->GetSubList();
+ if ( pProjects ) {
+ GenericInformation * pProject = pProjects->First();
+ while (pProject) {
+ String sLocalSourceRoot = sSourceRoot;
+ ByteString sProject( *pProject );
+ String ssProject( sProject, RTL_TEXTENCODING_ASCII_US );
+
+ ByteString aDirStr ("Directory");
+ GenericInformation * pDir = pProject->GetSubInfo (aDirStr);
+ if (pDir) {
+ ByteString aDir = pDir->GetValue();
+ DirEntry aRootEntry;
+ if (bShortPath)
+ aRootEntry = aEntry + DirEntry(aDir);
+ else
+ aRootEntry = aEntry.GetPath() + DirEntry(aDir);
+ sLocalSourceRoot = aRootEntry.GetFull();
+ }
+
+ String aBuildListPath = CreateFileName(ssProject, sLocalSourceRoot);
+
+ pFileList->Insert( new String( aBuildListPath ), LIST_APPEND );
+ ByteString sFile( aBuildListPath, RTL_TEXTENCODING_ASCII_US );
+ pProject = pProjects->Next();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!CheckFileLoadList(pFileList))
+ {
+ ClearAvailableDeps();
+ ClearCurrentDeps();
+ ClearLoadedFilesList();
+ RemoveAllPrj();
+ bRead = TRUE; // read new list because old list is deleted
+ }
+
+ if (bRead)
+ Read( pFileList );
+ else
+ GenerateFileLoadList( pFileList );
+ }
+}
+
+/*****************************************************************************/
+void Star::FullReload( GenericInformationList *pStandLst, ByteString &rVersion,
+ BOOL bRead, BOOL bLocal, const char *pSourceRoot )
+/*****************************************************************************/
+{
+ ClearAvailableDeps();
+ ClearCurrentDeps();
+ ClearLoadedFilesList();
+ RemoveAllPrj();
+ UpdateFileList( pStandLst, rVersion, bRead, bLocal, pSourceRoot );
+}
+
+/*****************************************************************************/
+BOOL Star::CheckFileLoadList(SolarFileList *pSolarFiles)
+/*****************************************************************************/
+{
+ BOOL bRet = TRUE;
+ if (aLoadedFilesList.Count() == 0)
+ return bRet;
+ StarFile * pLoadFile = aLoadedFilesList.First();
+ while (pLoadFile)
+ {
+ BOOL bIsAvailable = FALSE;
+ String * pFile = pSolarFiles->First();
+ while (pFile)
+ {
+ if (*pFile == pLoadFile->GetName())
+ {
+ bIsAvailable = TRUE;
+ break;
+ }
+ pFile = pSolarFiles->Next();
+ }
+ if (!bIsAvailable)
+ {
+ bRet = FALSE;
+ break;
+ }
+ pLoadFile = aLoadedFilesList.Next();
+ }
+ return bRet;
+}
+
+/*****************************************************************************/
+Star::~Star()
+/*****************************************************************************/
+{
+ ClearAvailableDeps();
+ ClearCurrentDeps();
+ ClearLoadedFilesList();
+ RemoveAllPrj();
+}
+
+/*****************************************************************************/
+void Star::GenerateFileLoadList( SolarFileList *pSolarFiles )
+/*****************************************************************************/
+{
+ SolarFileList* pNewSolarFiles = NULL;
+ while( pSolarFiles->Count()) {
+ StarFile *pFile = new StarFile( *pSolarFiles->GetObject(( ULONG ) 0 ));
+ aMutex.acquire();
+ ULONG nPos = SearchFileEntry(&aLoadedFilesList, pFile);
+ if ( nPos == LIST_ENTRY_NOTFOUND )
+ {
+ if (!pNewSolarFiles)
+ pNewSolarFiles = new SolarFileList();
+
+ pNewSolarFiles->Insert(new String(pFile->GetName()), LIST_APPEND );
+ }
+ aMutex.release();
+ delete pSolarFiles->Remove(( ULONG ) 0 );
+ delete pFile;
+ }
+ delete pSolarFiles;
+ if (pNewSolarFiles)
+ Read (pNewSolarFiles);
+}
+
+/*****************************************************************************/
+SolarFileList* Star::NeedsFilesForUpdate()
+/*****************************************************************************/
+{
+ aMutex.acquire();
+ SolarFileList* pPrjList = NULL;
+ for ( ULONG i = 0; i < aLoadedFilesList.Count(); i++ )
+ if ( aLoadedFilesList.GetObject( i )->NeedsUpdate()) {
+ if (!pPrjList)
+ pPrjList = new SolarFileList();
+
+ pPrjList->Insert(new String (aLoadedFilesList.GetObject( i )->GetName()), LIST_APPEND);
+ }
+
+ aMutex.release();
+ return pPrjList;
+}
+
+/*****************************************************************************/
+BOOL Star::NeedsUpdate()
+/*****************************************************************************/
+{
+ aMutex.acquire();
+ for ( ULONG i = 0; i < aLoadedFilesList.Count(); i++ )
+ if ( aLoadedFilesList.GetObject( i )->NeedsUpdate()) {
+ aMutex.release();
+ return TRUE;
+ }
+
+ aMutex.release();
+ return FALSE;
+}
+
+/*****************************************************************************/
+void Star::Read( String &rFileName )
+/*****************************************************************************/
+{
+ ClearAvailableDeps ();
+ ByteString aString;
+ aFileList.Insert( new String( rFileName ));
+
+ DirEntry aEntry( rFileName );
+ aEntry.ToAbs();
+ aEntry = aEntry.GetPath().GetPath().GetPath();
+ sSourceRoot = aEntry.GetFull();
+
+ while( aFileList.Count()) {
+ String ssFileName = *aFileList.GetObject(( ULONG ) 0 );
+ StarFile* pFile = ReadBuildlist (ssFileName);
+ aMutex.acquire();
+ ReplaceFileEntry (&aLoadedFilesList, pFile);
+ //aLoadedFilesList.Insert( pFile, LIST_APPEND );
+ aMutex.release();
+ aFileList.Remove(( ULONG ) 0 );
+ }
+ // resolve all dependencies recursive
+ Expand_Impl();
+}
+
+/*****************************************************************************/
+ULONG Star::SearchFileEntry( StarFileList *pStarFiles, StarFile* pFile )
+/*****************************************************************************/
+{
+ StarFile *pSearchFile;
+ ULONG nCount_l;
+
+ nCount_l = pStarFiles->Count();
+
+ for ( ULONG i=0; i<nCount_l; i++)
+ {
+ pSearchFile = pStarFiles->GetObject(i);
+ if ( pSearchFile->GetName() == pFile->GetName() )
+ {
+ return i;
+ }
+ }
+ return LIST_ENTRY_NOTFOUND;
+}
+
+/*****************************************************************************/
+void Star::ReplaceFileEntry( StarFileList *pStarFiles, StarFile* pFile )
+/*****************************************************************************/
+{
+ ULONG nPos = SearchFileEntry(pStarFiles, pFile);
+ if ( nPos != LIST_ENTRY_NOTFOUND )
+ {
+ StarFile* pTmpStarFile = pStarFiles->GetObject(nPos);
+ delete pTmpStarFile;
+ pStarFiles->Replace(pFile, nPos);
+ return;
+ }
+ pStarFiles->Insert( pFile, LIST_APPEND );
+}
+
+/*****************************************************************************/
+void Star::Read( SolarFileList *pSolarFiles )
+/*****************************************************************************/
+{
+ ClearAvailableDeps ();
+ while( pSolarFiles->Count()) {
+ ByteString aString;
+
+ String ssFileName = *pSolarFiles->GetObject(( ULONG ) 0 );
+ StarFile *pFile = ReadBuildlist ( ssFileName);
+
+ if ( pFile->Exists()) {
+ DirEntry aEntry( pFile->GetName() );
+ DirEntry aEntryPrj = aEntry.GetPath().GetPath();
+ if (aEntryPrj.GetExtension() != String::CreateFromAscii( "" ))
+ {
+ aEntryPrj.CutExtension();
+ ByteString aPrjName = ByteString( aEntryPrj.GetName(), gsl_getSystemTextEncoding());
+ Prj* pPrj = GetPrj(aPrjName);
+ if (pPrj)
+ pPrj->IsAvailable (FALSE);
+ }
+
+ }
+
+ aMutex.acquire();
+ ReplaceFileEntry (&aLoadedFilesList, pFile);
+ //aLoadedFilesList.Insert( pFile, LIST_APPEND );
+ aMutex.release();
+ delete pSolarFiles->Remove(( ULONG ) 0 );
+ }
+ delete pSolarFiles;
+
+ Expand_Impl();
+}
+
+/*****************************************************************************/
+String Star::CreateFileName( String& rProject, String& rSourceRoot )
+/*****************************************************************************/
+{
+ // this method is used to find solarlist parts of nabours (other projects)
+ String sPrjDir( String::CreateFromAscii( "prj" ));
+ String sBuildList( String::CreateFromAscii( "build.lst" ));
+// String sXmlBuildList( String::CreateFromAscii( "build.xlist" ));
+
+ DirEntry aEntry( rSourceRoot );
+ aEntry += DirEntry( rProject );
+
+ // if this project not exists, maybe it's a not added project of a CWS
+
+ if ( !aEntry.Exists() ) {
+ aEntry.SetExtension(String::CreateFromAscii( "lnk" ));
+ if ( !aEntry.Exists() )
+ aEntry.CutExtension();
+
+ aEntry.SetExtension(String::CreateFromAscii( "link" ));
+ if ( !aEntry.Exists() )
+ aEntry.CutExtension();
+ }
+
+ aEntry += DirEntry( sPrjDir );
+
+// DirEntry aPossibleEntry(aEntry);
+// aPossibleEntry += DirEntry( sXmlBuildList );
+
+ aEntry += DirEntry( sBuildList );
+
+ DirEntry& aActualEntry = aEntry;
+/*
+ if (aPossibleEntry.Exists()) {
+ aActualEntry = aPossibleEntry;
+ } else */
+ if ( !aActualEntry.Exists() && aDBNotFoundHdl.IsSet())
+ aDBNotFoundHdl.Call( &rProject );
+ return aActualEntry.GetFull();
+}
+
+/*****************************************************************************/
+void Star::InsertSolarList( String sProject )
+/*****************************************************************************/
+{
+ // inserts a new solarlist part of another project
+ String sFileName_l( CreateFileName( sProject, sSourceRoot ));
+
+ for ( ULONG i = 0; i < aFileList.Count(); i++ ) {
+ if (( *aFileList.GetObject( i )) == sFileName_l )
+ return;
+ }
+
+ ByteString ssProject( sProject, RTL_TEXTENCODING_ASCII_US );
+ if ( HasProject( ssProject ))
+ return;
+
+ aFileList.Insert( new String( sFileName_l ), LIST_APPEND );
+}
+
+/*****************************************************************************/
+void Star::ExpandPrj_Impl( Prj *pPrj, Prj *pDepPrj )
+/*****************************************************************************/
+{
+ if ( pDepPrj->bVisited )
+ return;
+
+ pDepPrj->bVisited = TRUE;
+
+ SByteStringList* pPrjLst = pPrj->GetDependencies();
+ SByteStringList* pDepLst = NULL;
+ ByteString* pDepend;
+ ByteString* pPutStr;
+ Prj *pNextPrj = NULL;
+ ULONG i, nRetPos;
+
+ if ( pPrjLst ) {
+ pDepLst = pDepPrj->GetDependencies();
+ if ( pDepLst ) {
+ for ( i = 0; i < pDepLst->Count(); i++ ) {
+ pDepend = pDepLst->GetObject( i );
+ pPutStr = new ByteString( *pDepend );
+ nRetPos = pPrjLst->PutString( pPutStr );
+ if( nRetPos == NOT_THERE )
+ delete pPutStr;
+ pNextPrj = GetPrj( *pDepend );
+ if ( pNextPrj ) {
+ ExpandPrj_Impl( pPrj, pNextPrj );
+ }
+ }
+ }
+ }
+}
+
+/*****************************************************************************/
+void Star::Expand_Impl()
+/*****************************************************************************/
+{
+ for ( ULONG i = 0; i < Count(); i++ ) {
+ for ( ULONG j = 0; j < Count(); j++ )
+ GetObject( j )->bVisited = FALSE;
+
+ Prj* pPrj = GetObject( i );
+ pPrj->SetMode(pDepMode); // DepList fr Mode initialisieren
+ ExpandPrj_Impl( pPrj, pPrj );
+ }
+}
+
+/*****************************************************************************/
+StarFile* Star::ReadBuildlist (const String& rFilename, BOOL bReadComments, BOOL bExtendAlias)
+/*****************************************************************************/
+{
+ ByteString sFileName_l(rFilename, RTL_TEXTENCODING_ASCII_US);
+ StarFile *pFile = new StarFile( rFilename );
+ if ( pFile->Exists()) {
+ SimpleConfig aSolarConfig( rFilename );
+ DirEntry aEntry(rFilename);
+ ByteString sProjectName (aEntry.GetPath().GetPath().GetName(), RTL_TEXTENCODING_ASCII_US);
+ Prj* pPrj = GetPrj (sProjectName); // 0, if Prj not found
+ if (pPrj)
+ {
+ Remove(pPrj); // Project exist, remove old Project and read again
+ DELETEZ (pPrj); // delete and set pPrj to 0
+ }
+ ByteString aString;
+ while (( aString = aSolarConfig.GetCleanedNextLine( bReadComments )) != ByteString::EmptyString() )
+ InsertTokenLine ( aString, &pPrj, sProjectName, bExtendAlias );
+ }
+ return pFile;
+}
+
+/*****************************************************************************/
+void Star::InsertTokenLine ( const ByteString& rTokenLine, Prj** ppPrj, const ByteString& rProjectName, const sal_Bool bExtendAlias )
+/*****************************************************************************/
+{
+ int i = 0;
+ ByteString aWhat, aWhatOS,
+ sClientRestriction, aLogFileName, aProjectName, aPrefix, aCommandPara;
+ ByteString aDirName;
+ BOOL bPrjDep = FALSE;
+ BOOL bHardDep = FALSE;
+ BOOL bFixedDep = FALSE;
+ BOOL bNewProject = FALSE;
+ int nCommandType=0, nOSType=0;
+ Prj* pPrj = *ppPrj;
+ CommandData* pCmdData;
+ SByteStringList *pDepList = NULL;
+ ByteString aCommentString;
+ ByteString sToken;
+ ByteString sStringBuffer = rTokenLine;
+
+ while (sStringBuffer != ByteString::EmptyString())
+ {
+ ByteString sToken = sStringBuffer.GetToken(0,'\t');
+ sStringBuffer.Erase(0, sToken.Len()+1);
+
+ switch (i)
+ {
+ case 0:
+ if ( sToken.Search( "#" ) == 0 )
+ {
+ i = -1;
+ aCommentString = sToken;
+ sStringBuffer = ByteString::EmptyString();
+ if ( Count() == 0 )
+ aDirName = "null_entry" ; //comments at begin of file
+ }
+ else
+ {
+ aPrefix = sToken;
+ pDepList = 0;
+ }
+ break;
+ case 1:
+ aDirName = sToken;
+ aProjectName = aDirName.GetToken ( 0, 0x5c);
+ if (aProjectName != rProjectName)
+ sStringBuffer = ByteString::EmptyString(); // something is wrong, ignore line
+ break;
+ case 2:
+ if ( sToken.CompareTo(":") == COMPARE_EQUAL )
+ {
+ bPrjDep = TRUE;
+ bHardDep = FALSE;
+ bFixedDep = FALSE;
+ i = 9;
+ }
+ else if ( sToken.CompareTo("::") == COMPARE_EQUAL )
+ {
+ bPrjDep = TRUE;
+ bHardDep = TRUE;
+ bFixedDep = FALSE;
+ i = 9;
+ }
+ else if ( sToken.CompareTo(":::") == COMPARE_EQUAL )
+ {
+ bPrjDep = TRUE;
+ bHardDep = TRUE;
+ bFixedDep = TRUE;
+ i = 9;
+ }
+ else
+ {
+ bPrjDep = FALSE;
+ bHardDep = FALSE;
+ bFixedDep = FALSE;
+
+ aWhat = sToken;
+ nCommandType = GetJobType(aWhat);
+ }
+ if (bPrjDep)
+ {
+ if (pPrj)
+ sStringBuffer = ByteString::EmptyString(); // definition more than once or not first line, ignore line
+ }
+ break;
+ case 3:
+ if ( !bPrjDep )
+ {
+ aWhat = sToken;
+ if ( aWhat == "-" )
+ {
+ aCommandPara = ByteString();
+ }
+ else
+ aCommandPara = aWhat;
+ }
+ break;
+ case 4:
+ if ( !bPrjDep )
+ {
+ aWhatOS = sToken;
+ if ( aWhatOS.GetTokenCount( ',' ) > 1 ) {
+ sClientRestriction = aWhatOS.Copy( aWhatOS.GetToken( 0, ',' ).Len() + 1 );
+ aWhatOS = aWhatOS.GetToken( 0, ',' );
+ }
+ nOSType = GetOSType (aWhatOS);
+ }
+ break;
+ case 5:
+ if ( !bPrjDep )
+ {
+ if (bExtendAlias)
+ aLogFileName = (ByteString(aProjectName).Append("_")).Append(sToken);
+ else
+ aLogFileName = sToken;
+
+ }
+ break;
+ default:
+ if ( !bPrjDep )
+ {
+ ByteString aItem = sToken;
+ if ( aItem == "NULL" )
+ {
+ // Liste zu Ende
+ i = -1;
+ }
+ else
+ {
+ // ggfs. Dependency liste anlegen und ergaenzen
+ if ( !pDepList )
+ pDepList = new SByteStringList;
+ ByteString* pStr;
+ if (bExtendAlias)
+ pStr = new ByteString ((ByteString (aProjectName).Append("_")).Append(aItem));
+ else
+ pStr = new ByteString (aItem);
+ pDepList->PutString( pStr );
+ }
+ }
+ else
+ {
+ ByteString aItem = sToken;
+ if ( aItem == "NULL" )
+ {
+ // Liste zu Ende
+ i = -1;
+ bPrjDep= FALSE;
+ }
+ else
+ {
+ ByteString sMode;
+ BOOL bHasModes = FALSE;
+ if (aItem.Search(":") != STRING_NOTFOUND)
+ {
+ sMode = aItem.GetToken ( 0, ':');
+ aItem = aItem.GetToken ( 1, ':');
+ bHasModes = TRUE;
+ }
+ if (!pPrj)
+ {
+ // neues Project anlegen
+ pPrj = new Prj ( aProjectName );
+ pPrj->SetPreFix( aPrefix );
+ bNewProject = TRUE;
+ }
+ if (bHasModes)
+ pPrj->AddDependencies( aItem, sMode );
+ else
+ pPrj->AddDependencies( aItem );
+ pPrj->HasHardDependencies( bHardDep );
+ pPrj->HasFixedDependencies( bFixedDep );
+ }
+ }
+ break;
+ }
+ if ( i == -1 )
+ break;
+ i++;
+ }
+ /* Wenn dieses Project noch nicht vertreten ist, in die Liste
+ der Solar-Projekte einfuegen */
+ if ( i == -1 )
+ {
+ if (!pPrj)
+ {
+ // neues Project anlegen
+ pPrj = new Prj ( aProjectName );
+ pPrj->SetPreFix( aPrefix );
+ bNewProject = TRUE;
+ }
+
+ if (bNewProject)
+ Insert(pPrj,LIST_APPEND);
+
+ pCmdData = new CommandData;
+ pCmdData->SetPath( aDirName );
+ pCmdData->SetCommandType( nCommandType );
+ pCmdData->SetCommandPara( aCommandPara );
+ pCmdData->SetOSType( nOSType );
+ pCmdData->SetLogFile( aLogFileName );
+ pCmdData->SetComment( aCommentString );
+ pCmdData->SetClientRestriction( sClientRestriction );
+ if ( pDepList )
+ pCmdData->SetDependencies( pDepList );
+
+ pDepList = 0;
+ pPrj->Insert ( pCmdData, LIST_APPEND );
+
+ // und wer raeumt die depLst wieder ab ?
+ // CommandData macht das
+ }
+ else
+ {
+ if (!pPrj)
+ {
+ // new project to set the error flag
+ pPrj = new Prj ( rProjectName );
+ pPrj->SetPreFix( aPrefix );
+ bNewProject = TRUE;
+ }
+ if (pPrj)
+ {
+ pPrj->SetError();
+ if (bNewProject)
+ Insert(pPrj,LIST_APPEND); // add project even if there is a buildlist error
+ }
+ if ( pDepList )
+ delete pDepList;
+ }
+ *ppPrj = pPrj;
+}
+
+/*****************************************************************************/
+BOOL Star::HasProject ( ByteString aProjectName )
+/*****************************************************************************/
+{
+ Prj *pPrj;
+ int nCount_l;
+
+ nCount_l = Count();
+
+ for ( int i=0; i<nCount_l; i++)
+ {
+ pPrj = GetObject(i);
+ if ( pPrj->GetProjectName().ToLowerAscii() == aProjectName.ToLowerAscii() )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*****************************************************************************/
+Prj* Star::GetPrj ( ByteString aProjectName )
+/*****************************************************************************/
+{
+ Prj* pPrj;
+ int nCount_l = Count();
+ for ( int i=0;i<nCount_l;i++)
+ {
+ pPrj = GetObject(i);
+ if ( pPrj->GetProjectName().ToLowerAscii() == aProjectName.ToLowerAscii() )
+ return pPrj;
+ }
+// return (Prj*)NULL;
+ return 0L ;
+}
+
+/*****************************************************************************/
+BOOL Star::RemovePrj ( Prj* pPrj )
+/*****************************************************************************/
+{
+ ULONG nPos = GetPos(pPrj);
+ if (nPos != LIST_ENTRY_NOTFOUND) {
+ delete pPrj;
+ Remove(nPos);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*****************************************************************************/
+void Star::RemoveAllPrj ()
+/*****************************************************************************/
+{
+ Prj* pPrj = First();
+ while (pPrj)
+ {
+ delete pPrj;
+ pPrj = Next();
+ }
+ Clear();
+}
+
+/*****************************************************************************/
+ByteString Star::GetPrjName( DirEntry &aPath )
+/*****************************************************************************/
+{
+ ByteString aRetPrj, aDirName;
+ ByteString aFullPathName = ByteString( aPath.GetFull(), gsl_getSystemTextEncoding());
+
+ USHORT nToken = aFullPathName.GetTokenCount(PATH_DELIMETER);
+ for ( int i=0; i< nToken; i++ )
+ {
+ aDirName = aFullPathName.GetToken( i, PATH_DELIMETER );
+ if ( HasProject( aDirName ))
+ {
+ aRetPrj = aDirName;
+ break;
+ }
+ }
+
+ return aRetPrj;
+}
+
+/*****************************************************************************/
+void Star::ClearAvailableDeps ()
+/*****************************************************************************/
+{
+ if ( pAllDepMode )
+ {
+ ByteString *pString = pAllDepMode->First();
+ while ( pString )
+ {
+ delete pString;
+ pString = pAllDepMode->Next();
+ }
+ delete pAllDepMode;
+ pAllDepMode = NULL;
+ }
+}
+
+/*****************************************************************************/
+void Star::ClearLoadedFilesList ()
+/*****************************************************************************/
+{
+ StarFile *pStarFile = aLoadedFilesList.First();
+ while ( pStarFile )
+ {
+ delete pStarFile;
+ pStarFile = aLoadedFilesList.Next();
+ }
+ aLoadedFilesList.Clear();
+}
+
+/*****************************************************************************/
+void Star::ClearCurrentDeps ()
+/*****************************************************************************/
+{
+ if ( pDepMode )
+ {
+ ByteString *pString = pDepMode->First();
+ while ( pString )
+ {
+ delete pString;
+ pString = pDepMode->Next();
+ }
+ delete pDepMode;
+ pDepMode = NULL;
+ }
+}
+
+/*****************************************************************************/
+SByteStringList* Star::GetAvailableDeps ()
+/*****************************************************************************/
+{
+ if ( pAllDepMode )
+ return pAllDepMode;
+
+ Prj *pPrj;
+ ByteString* pStr;
+ pPrj = First();
+ while (pPrj)
+ {
+ SByteStringList* pModeList = NULL;
+ if (pPrj->GetModeAndDependencies() && (pModeList = pPrj->GetModeAndDependencies()->GetAllDepModes()))
+ {
+ pStr = pModeList->First();
+ while (pStr)
+ {
+ if ( !pAllDepMode )
+ pAllDepMode = new SByteStringList();
+
+ if (pAllDepMode->IsString(pStr) == NOT_THERE)
+ pAllDepMode->PutString(new ByteString(*pStr));
+
+ pStr = pModeList->Next();
+ }
+ }
+ pPrj = Next();
+ }
+ return pAllDepMode;
+}
+
+/*****************************************************************************/
+void Star::SetCurrentDeps (SByteStringList* pDepList)
+/*****************************************************************************/
+{
+ ClearCurrentDeps();
+
+ if (pDepList)
+ {
+ pDepMode = new SByteStringList();
+ ByteString *pString = pDepList->First();
+ while ( pString )
+ {
+ ByteString* pStr = new ByteString (*pString);
+ if (pDepMode->PutString(pStr) == NOT_THERE)
+ delete pStr; // String is not in List
+ pString = pDepList->Next();
+ }
+ }
+ Expand_Impl();
+}
+
+///*****************************************************************************/
+//void Star::ReadXmlBuildList(const ByteString& sBuildLstPath) {
+///*****************************************************************************/
+// if (mpXmlBuildList) {
+// Prj* pPrj = NULL;
+//
+// try {
+// mpXmlBuildList->loadXMLFile(sBuildLstPath);
+// }
+// catch (XmlBuildListException) {
+// DirEntry aDirEntry (sBuildLstPath);
+// String ssPrjName = aDirEntry.GetPath().GetPath().GetBase();
+// ByteString sPrjName = ByteString(ssPrjName, RTL_TEXTENCODING_ASCII_US);
+// pPrj = GetPrj( sPrjName );
+// if (pPrj)
+// {
+// //remove old Project
+// RemovePrj (pPrj);
+// }
+// return;
+// }
+//
+// try {
+// ByteString sProjectName = mpXmlBuildList->getModuleName();
+// pPrj = GetPrj( sProjectName );
+// if (pPrj)
+// {
+// //remove old Project
+// RemovePrj (pPrj);
+// }
+//
+// // insert new Project
+// pPrj = new Prj ( sProjectName );
+// pPrj->SetPreFix( sProjectName ); // use ProjectName as Prefix
+// Insert(pPrj,LIST_APPEND);
+//
+// // get global dependencies
+// FullByteStringListWrapper aProducts = mpXmlBuildList->getProducts();
+// ByteString aDepType = ByteString(DEP_MD_ALWAYS_STR);
+// if (mpXmlBuildList->hasModuleDepType(aProducts, aDepType))
+// pPrj->HasHardDependencies( TRUE );
+//
+// aDepType = ByteString(DEP_MD_FORCE_STR);
+// if (mpXmlBuildList->hasModuleDepType(aProducts, aDepType))
+// {
+// pPrj->HasHardDependencies( TRUE );
+// pPrj->HasFixedDependencies( TRUE );
+// }
+//
+// // modul dependencies
+// ByteString sModulDepType = ByteString();
+// FullByteStringListWrapper aModulDeps = mpXmlBuildList->getModuleDependencies(aProducts, sModulDepType);
+// ByteString * pModulDep = aModulDeps.First();
+// while (pModulDep)
+// {
+// FullByteStringListWrapper aModulProducts = mpXmlBuildList->getModuleProducts(*pModulDep);
+// ByteString *pModulePoduct = aModulProducts.First();
+// while (pModulePoduct)
+// {
+// if (*pModulePoduct == XML_ALL)
+// pPrj->AddDependencies( *pModulDep );
+// else
+// pPrj->AddDependencies( *pModulDep, *pModulePoduct);
+//
+// pModulePoduct = aModulProducts.Next();
+// }
+// pModulDep = aModulDeps.Next();
+// }
+//
+// // job dirs
+// ByteString sJobType = ByteString();
+// ByteString sJobPlatforms = ByteString();
+// FullByteStringListWrapper aJobDirs = mpXmlBuildList->getJobDirectories(sJobType, sJobPlatforms); // all dirs
+// ByteString* pJobDir = aJobDirs.First();
+// while (pJobDir)
+// {
+// FullByteStringListWrapper aJobPlatforms = mpXmlBuildList->getJobPlatforms (*pJobDir);
+// ByteString* pJobPlatform = aJobPlatforms.First();
+// while (pJobPlatform)
+// {
+// ByteString sJobRestriction = ByteString();
+// FullByteStringListWrapper aJobReq = mpXmlBuildList->getJobBuildReqs (*pJobDir, *pJobPlatform);
+// // nur ein Req pro Platform wird zur Zeit untersttzt
+// // mehr geht wegen der Struktur zur Zeit nicht!
+// // lese sie trotzdem kommasepariert ein, wenn ntig
+// if (aJobReq.Count() > 0)
+// {
+// ByteString* pRestriction = aJobReq.First();
+// sJobRestriction = ByteString (*pRestriction);
+// pRestriction = aJobReq.Next();
+// while (pRestriction)
+// {
+// sJobRestriction += ByteString (",");
+// sJobRestriction += ByteString (*pRestriction);
+// pRestriction = aJobReq.Next();
+// }
+// }
+//
+// FullByteStringListWrapper aJobTypes = mpXmlBuildList->getJobTypes (*pJobDir);
+// ByteString * pJobType = aJobTypes.First();
+// while(pJobType)
+// {
+// FullByteStringListWrapper aDirDependencies = mpXmlBuildList->getDirDependencies(*pJobDir, *pJobType, *pJobPlatform);
+// SByteStringList *pDepList = NULL;
+// if (aDirDependencies.Count() > 0)
+// {
+// pDepList = new SByteStringList;
+// ByteString* pDirDep = aDirDependencies.First();
+// while (pDirDep)
+// {
+// ByteString sFullDir = sProjectName;
+// sFullDir += *pDirDep;
+// sFullDir.SearchAndReplaceAll('/', '\\');
+// *pDirDep = sFullDir;
+// pDepList->PutString(pDirDep); // String wird bergeben
+// aDirDependencies.Remove(); // Zeiger aus alter Liste lschen
+// pDirDep = aDirDependencies.First();
+// }
+// }
+// // insert CommandData
+// CommandData * pCmdData = new CommandData;
+// ByteString sRequiredPath = sProjectName;
+// sRequiredPath += *pJobDir;
+// sRequiredPath.SearchAndReplaceAll('/', '\\');
+// pCmdData->SetPath(sRequiredPath);
+// pCmdData->SetCommandType( GetJobType(*pJobType) );
+// pCmdData->SetCommandPara( ByteString() );
+// pCmdData->SetOSType( GetOSType(*pJobPlatform) );
+// ByteString sLogFileName = sProjectName;
+// sLogFileName += ByteString::CreateFromInt64( pPrj->Count() );
+// pCmdData->SetLogFile( sLogFileName );
+// pCmdData->SetClientRestriction( sJobRestriction );
+// if ( pDepList )
+// pCmdData->SetDependencies( pDepList );
+//
+// pPrj->Insert ( pCmdData, LIST_APPEND );
+//
+// pJobType = aJobTypes.Next();
+// }
+//
+// pJobPlatform = aJobPlatforms.Next();
+// }
+//
+// pJobDir = aJobDirs.Next();
+// }
+// pPrj->ExtractDependencies();
+// }
+// catch (XmlBuildListException) {
+// if (pPrj)
+// {
+// RemovePrj (pPrj);
+// delete pPrj;
+// }
+//
+// }
+// }
+//}
+
+/*****************************************************************************/
+int Star::GetOSType ( ByteString& aWhatOS ) {
+/*****************************************************************************/
+ int nOSType = OS_NONE;
+ if ( aWhatOS == "all" )
+ nOSType = ( OS_WIN16 | OS_WIN32 | OS_OS2 | OS_UNX | OS_MAC );
+ else if ( aWhatOS == "w" || aWhatOS == "wnt" )
+ nOSType = ( OS_WIN16 | OS_WIN32 );
+ else if ( aWhatOS == "p" )
+ nOSType = OS_OS2;
+ else if ( aWhatOS == "u" || aWhatOS == "unx" )
+ nOSType = OS_UNX;
+ else if ( aWhatOS == "d" )
+ nOSType = OS_WIN16;
+ else if ( aWhatOS == "n" )
+ nOSType = OS_WIN32;
+ else if ( aWhatOS == "m" || aWhatOS == "mac" )
+ nOSType = OS_MAC;
+ return nOSType;
+
+};
+
+/*****************************************************************************/
+int Star::GetJobType ( ByteString& JobType ) {
+/*****************************************************************************/
+ int nCommandType = 0;
+ if ( JobType == "nmake" || JobType == "make")
+ nCommandType = COMMAND_NMAKE;
+ else if ( JobType == "get" )
+ nCommandType = COMMAND_GET;
+ else {
+ ULONG nOffset = JobType.Copy( 3 ).ToInt32();
+ nCommandType = COMMAND_USER_START + nOffset - 1;
+ }
+ return nCommandType;
+};
+
+/*****************************************************************************/
+void Star::PutPrjIntoStream (SByteStringList* pPrjNameList, SvStream* pStream)
+/*****************************************************************************/
+{
+ aMutex.acquire();
+ *pStream << sal_False; // not full Star / only some Projects
+
+ ULONG nCount_l = pPrjNameList->Count();
+ *pStream << nCount_l;
+ ByteString* pStr = pPrjNameList->First();
+ while (pStr) {
+ Prj* pPrj = GetPrj (*pStr);
+ *pPrj >> *pStream;
+ pStr = pPrjNameList->Next();
+ }
+ aMutex.release();
+}
+
+/*****************************************************************************/
+Star& Star::operator>> ( SvStream& rStream )
+/*****************************************************************************/
+{
+ aMutex.acquire();
+ rStream << sal_True; // full Star
+ rStream << nStarMode;
+ if (pDepMode)
+ {
+ rStream << sal_True;
+ *pDepMode >> rStream;
+ }
+ else
+ rStream << sal_False;
+
+ ULONG nCount_l = Count();
+ rStream << nCount_l;
+ Prj* pPrj = First();
+ while (pPrj) {
+ *pPrj >> rStream;
+ pPrj = Next();
+ }
+ aMutex.release();
+
+ return *this;
+}
+
+/*****************************************************************************/
+Star& Star::operator<< ( SvStream& rStream )
+/*****************************************************************************/
+{
+ aMutex.acquire();
+ BOOL bFullList;
+ rStream >> bFullList;
+ if (bFullList)
+ {
+ rStream >> nStarMode;
+ BOOL bDepMode;
+ rStream >> bDepMode;
+ if (pDepMode)
+ pDepMode->CleanUp();
+ if (bDepMode)
+ {
+ if (!pDepMode)
+ pDepMode = new SByteStringList();
+ *pDepMode << rStream;
+ }
+ else
+ DELETEZ (pDepMode);
+
+ }
+ ULONG nCount_l;
+ rStream >> nCount_l;
+ for ( USHORT i = 0; i < nCount_l; i++ ) {
+ Prj* pPrj = new Prj();
+ *pPrj << rStream;
+ pPrj->SetMode(pDepMode);
+ if (HasProject (pPrj->GetProjectName())) {
+ Prj* pTmpPrj = GetPrj( pPrj->GetProjectName() );
+ Replace (pPrj, pTmpPrj);
+ delete pTmpPrj;
+ }
+ else
+ Insert (pPrj, LIST_APPEND);
+ }
+ Expand_Impl();
+ aMutex.release();
+ return *this;
+}
+
+
+
+//
+// class StarWriter
+//
+
+/*****************************************************************************/
+StarWriter::StarWriter( String aFileName, BOOL bReadComments, USHORT nMode )
+/*****************************************************************************/
+ : Star ()
+{
+ sFileName = aFileName;
+ Read ( aFileName, bReadComments, nMode );
+}
+
+/*****************************************************************************/
+StarWriter::StarWriter( SolarFileList *pSolarFiles, BOOL bReadComments )
+/*****************************************************************************/
+ : Star ()
+{
+ Read( pSolarFiles, bReadComments );
+}
+
+/*****************************************************************************/
+StarWriter::StarWriter( GenericInformationList *pStandLst, ByteString &rVersion,
+ ByteString &rMinor, BOOL bReadComments, BOOL bLocal, const char *pSourceRoot )
+/*****************************************************************************/
+ : Star ()
+{
+ ByteString sPath( rVersion );
+ if ( pSourceRoot )
+ sSourceRoot = String::CreateFromAscii( pSourceRoot );
+
+#ifdef UNX
+ sPath += "/settings/UNXSOLARLIST";
+#else
+ sPath += "/settings/SOLARLIST";
+#endif
+ GenericInformation *pInfo_l = pStandLst->GetInfo( sPath, TRUE );
+
+ if( pInfo_l && pInfo_l->GetValue().Len()) {
+ ByteString sFile( pInfo_l->GetValue());
+ if ( bLocal ) {
+ IniManager aIniManager;
+ aIniManager.ToLocal( sFile );
+ }
+ String sFileName_l( sFile, RTL_TEXTENCODING_ASCII_US );
+ nStarMode = STAR_MODE_SINGLE_PARSE;
+ Read( sFileName_l, bReadComments );
+ }
+ else {
+ SolarFileList *pFileList = new SolarFileList();
+
+ sPath = rVersion;
+ sPath += "/drives";
+
+ GenericInformation *pInfo_k = pStandLst->GetInfo( sPath, TRUE );
+ if ( pInfo_k && pInfo_k->GetSubList()) {
+ GenericInformationList *pDrives = pInfo_k->GetSubList();
+ for ( ULONG i = 0; i < pDrives->Count(); i++ ) {
+ GenericInformation *pDrive = pDrives->GetObject( i );
+ if ( pDrive ) {
+ DirEntry aEntry;
+ BOOL bOk = FALSE;
+ if ( sSourceRoot.Len()) {
+ aEntry = DirEntry( sSourceRoot );
+ bOk = TRUE;
+ }
+ else {
+#ifdef UNX
+ sPath = "UnixVolume";
+ GenericInformation *pUnixVolume = pDrive->GetSubInfo( sPath );
+ if ( pUnixVolume ) {
+ String sRoot( pUnixVolume->GetValue(), RTL_TEXTENCODING_ASCII_US );
+ aEntry = DirEntry( sRoot );
+ bOk = TRUE;
+ }
+#else
+ bOk = TRUE;
+ String sRoot( *pDrive, RTL_TEXTENCODING_ASCII_US );
+ sRoot += String::CreateFromAscii( "\\" );
+ aEntry = DirEntry( sRoot );
+#endif
+ }
+ if ( bOk ) {
+ sPath = "projects";
+ GenericInformation *pProjectsKey = pDrive->GetSubInfo( sPath, TRUE );
+ if ( pProjectsKey ) {
+ if ( !sSourceRoot.Len()) {
+ sPath = rVersion;
+ sPath += "/settings/PATH";
+ GenericInformation *pPath = pStandLst->GetInfo( sPath, TRUE );
+ if( pPath ) {
+ ByteString sAddPath( pPath->GetValue());
+#ifdef UNX
+ sAddPath.SearchAndReplaceAll( "\\", "/" );
+#else
+ sAddPath.SearchAndReplaceAll( "/", "\\" );
+#endif
+ //If Minor has been set add it to path
+ if (rMinor.Len()>0) {
+ sAddPath += ".";
+ sAddPath += rMinor;
+ }
+ String ssAddPath( sAddPath, RTL_TEXTENCODING_ASCII_US );
+
+ aEntry += DirEntry( ssAddPath );
+ }
+ }
+ sPath = rVersion;
+ sPath += "/settings/SHORTPATH";
+ GenericInformation *pShortPath = pStandLst->GetInfo( sPath, TRUE );
+ BOOL bShortPath = FALSE;
+ if (pShortPath && (pShortPath->GetValue() == "_TRUE"))
+ bShortPath = TRUE;
+ sSourceRoot = aEntry.GetFull();
+ GenericInformationList *pProjects = pProjectsKey->GetSubList();
+ if ( pProjects ) {
+ String sPrjDir( String::CreateFromAscii( "prj" ));
+ String sSolarFile( String::CreateFromAscii( "build.lst" ));
+
+ GenericInformation * pProject = pProjects->First();
+ while (pProject) {
+ ByteString sProject( *pProject);
+ String ssProject( sProject, RTL_TEXTENCODING_ASCII_US );
+
+ DirEntry aPrjEntry( aEntry );
+
+ ByteString aDirStr ("Directory");
+ GenericInformation * pDir = pProject->GetSubInfo (aDirStr);
+ if (pDir) {
+ ByteString aDir = pDir->GetValue();
+ if (bShortPath)
+ aPrjEntry = aEntry;
+ else
+ aPrjEntry = aEntry.GetPath();
+ aPrjEntry += DirEntry(aDir);
+ }
+
+ aPrjEntry += DirEntry( ssProject );
+ aPrjEntry += DirEntry( sPrjDir );
+ aPrjEntry += DirEntry( sSolarFile );
+
+ pFileList->Insert( new String( aPrjEntry.GetFull()), LIST_APPEND );
+
+ ByteString sFile( aPrjEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
+ fprintf( stdout, "%s\n", sFile.GetBuffer());
+ pProject = pProjects->Next();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ Read( pFileList, bReadComments );
+ }
+}
+
+/*****************************************************************************/
+void StarWriter::CleanUp()
+/*****************************************************************************/
+{
+ Expand_Impl();
+}
+
+/*****************************************************************************/
+USHORT StarWriter::Read( String aFileName, BOOL bReadComments, USHORT nMode )
+/*****************************************************************************/
+{
+ sFileName = aFileName;
+
+ nStarMode = nMode;
+
+ ByteString aString;
+ aFileList.Insert( new String( aFileName ));
+
+ DirEntry aEntry( aFileName );
+ aEntry.ToAbs();
+ aEntry = aEntry.GetPath().GetPath().GetPath();
+ sSourceRoot = aEntry.GetFull();
+
+ while( aFileList.Count()) {
+ String ssFileName = *aFileList.GetObject(( ULONG ) 0 );
+ StarFile* pFile = ReadBuildlist (ssFileName, bReadComments, FALSE);
+ aMutex.acquire();
+ aLoadedFilesList.Insert( pFile, LIST_APPEND );
+ aMutex.release();
+ delete aFileList.Remove(( ULONG ) 0 );
+ }
+ // resolve all dependencies recursive
+ Expand_Impl();
+
+ // Die gefundenen Abhaengigkeiten rekursiv aufloesen
+ Expand_Impl();
+ return 0;
+}
+
+/*****************************************************************************/
+USHORT StarWriter::Read( SolarFileList *pSolarFiles, BOOL bReadComments )
+/*****************************************************************************/
+{
+ nStarMode = STAR_MODE_MULTIPLE_PARSE;
+
+ // this ctor is used by StarBuilder to get the information for the whole workspace
+ while( pSolarFiles->Count()) {
+ ByteString aString;
+ String ssFileName = *pSolarFiles->GetObject(( ULONG ) 0 );
+ StarFile* pFile = ReadBuildlist(ssFileName, bReadComments, FALSE);
+ aMutex.acquire();
+ aLoadedFilesList.Insert( pFile, LIST_APPEND );
+ aMutex.release();
+ delete pSolarFiles->Remove(( ULONG ) 0 );
+ }
+ delete pSolarFiles;
+
+ Expand_Impl();
+ return 0;
+}
+
+/*****************************************************************************/
+USHORT StarWriter::WritePrj( Prj *pPrj, SvFileStream& rStream )
+/*****************************************************************************/
+{
+ ByteString aDataString;
+ ByteString aTab('\t');
+ ByteString aSpace(' ');
+ ByteString aEmptyString("");
+ SByteStringList* pCmdDepList;
+ SByteStringList* pPrjDepList;
+
+ CommandData* pCmdData = NULL;
+ if ( pPrj->Count() > 0 )
+ {
+ pCmdData = pPrj->First();
+ if ( (pPrjDepList = pPrj->GetDependencies( FALSE )) )
+ {
+ aDataString = pPrj->GetPreFix();
+ aDataString += aTab;
+ aDataString += pPrj->GetProjectName();
+ aDataString += aTab;
+ if ( pPrj->HasFixedDependencies())
+ aDataString+= ByteString(":::");
+ else if ( pPrj->HasHardDependencies())
+ aDataString+= ByteString("::");
+ else
+ aDataString+= ByteString(":");
+ aDataString += aTab;
+ for ( USHORT i = 0; i< pPrjDepList->Count(); i++ ) {
+ aDataString += *pPrjDepList->GetObject( i );
+ aDataString += aSpace;
+ }
+ aDataString+= "NULL";
+
+ rStream.WriteLine( aDataString );
+
+ pCmdData = pPrj->Next();
+ }
+ if ( pCmdData ) {
+ do
+ {
+ if (( aDataString = pCmdData->GetComment()) == aEmptyString )
+ {
+ aDataString = pPrj->GetPreFix();
+ aDataString += aTab;
+
+ aDataString+= pCmdData->GetPath();
+ aDataString += aTab;
+ USHORT nPathLen = pCmdData->GetPath().Len();
+ if ( nPathLen < 40 )
+ for ( int i = 0; i < 9 - pCmdData->GetPath().Len() / 4 ; i++ )
+ aDataString += aTab;
+ else
+ for ( int i = 0; i < 12 - pCmdData->GetPath().Len() / 4 ; i++ )
+ aDataString += aTab;
+ aDataString += pCmdData->GetCommandTypeString();
+ aDataString += aTab;
+ if ( pCmdData->GetCommandType() == COMMAND_GET )
+ aDataString += aTab;
+ if ( pCmdData->GetCommandPara() == aEmptyString )
+ aDataString+= ByteString("-");
+ else
+ aDataString+= pCmdData->GetCommandPara();
+ aDataString += aTab;
+ aDataString+= pCmdData->GetOSTypeString();
+ if ( pCmdData->GetClientRestriction().Len()) {
+ aDataString += ByteString( "," );
+ aDataString += pCmdData->GetClientRestriction();
+ }
+ aDataString += aTab;
+ aDataString += pCmdData->GetLogFile();
+ aDataString += aSpace;
+
+ pCmdDepList = pCmdData->GetDependencies();
+ if ( pCmdDepList )
+ for ( USHORT i = 0; i< pCmdDepList->Count(); i++ ) {
+ aDataString += *pCmdDepList->GetObject( i );
+ aDataString += aSpace;
+ }
+ aDataString += "NULL";
+ }
+
+ rStream.WriteLine( aDataString );
+
+ pCmdData = pPrj->Next();
+ } while ( pCmdData );
+ }
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+USHORT StarWriter::Write( String aFileName )
+/*****************************************************************************/
+{
+ sFileName = aFileName;
+
+ FileStat::SetReadOnlyFlag( DirEntry( aFileName ), FALSE );
+
+ SvFileStream aFileStream;
+
+ aFileStream.Open( aFileName, STREAM_WRITE | STREAM_TRUNC);
+ if ( !aFileStream.IsOpen() && aFileIOErrorHdl.IsSet()) {
+ String sError( String::CreateFromAscii( "Error: Unable to open \"" ));
+ sError += aFileName;
+ sError += String::CreateFromAscii( "for writing!" );
+ aFileIOErrorHdl.Call( &sError );
+ }
+
+ if ( Count() > 0 )
+ {
+ Prj* pPrj = First();
+ do
+ {
+ WritePrj( pPrj, aFileStream );
+ pPrj = Next();
+ } while ( pPrj );
+ }
+
+ aFileStream.Close();
+
+ return 0;
+}
+
+/*****************************************************************************/
+USHORT StarWriter::WriteMultiple( String rSourceRoot )
+/*****************************************************************************/
+{
+ sSourceRoot = rSourceRoot;
+
+ if ( Count() > 0 )
+ {
+ String sPrjDir( String::CreateFromAscii( "prj" ));
+ String sSolarFile( String::CreateFromAscii( "build.lst" ));
+
+ Prj* pPrj = First();
+ do
+ {
+ String sName( pPrj->GetProjectName(), RTL_TEXTENCODING_ASCII_US );
+
+ DirEntry aEntry( rSourceRoot );
+ aEntry += DirEntry( sName );
+ aEntry += DirEntry( sPrjDir );
+ aEntry += DirEntry( sSolarFile );
+
+ FileStat::SetReadOnlyFlag( aEntry, FALSE );
+
+ SvFileStream aFileStream;
+ aFileStream.Open( aEntry.GetFull(), STREAM_WRITE | STREAM_TRUNC);
+
+ if ( !aFileStream.IsOpen() && aFileIOErrorHdl.IsSet()) {
+ String sError( String::CreateFromAscii( "Error: Unable to open \"" ));
+ sError += aEntry.GetFull();
+ sError += String::CreateFromAscii( "for writing!" );
+ aFileIOErrorHdl.Call( &sError );
+ }
+
+ WritePrj( pPrj, aFileStream );
+
+ aFileStream.Close();
+
+ pPrj = Next();
+ } while ( pPrj );
+ }
+
+ return 0;
+}
+
+/*****************************************************************************/
+void StarWriter::InsertTokenLine ( const ByteString& rTokenLine )
+/*****************************************************************************/
+{
+ ByteString sProjectName = rTokenLine.GetToken(1,'\t');
+ Prj* pPrj = GetPrj (sProjectName); // 0, if Prj not found;
+ Star::InsertTokenLine ( rTokenLine, &pPrj, sProjectName, sal_False );
+}
+
+/*****************************************************************************/
+BOOL StarWriter::InsertProject ( Prj* /*pNewPrj*/ )
+/*****************************************************************************/
+{
+ return FALSE;
+}
+
+/*****************************************************************************/
+Prj* StarWriter::RemoveProject ( ByteString aProjectName )
+/*****************************************************************************/
+{
+ ULONG nCount_l = Count();
+ Prj* pPrj;
+ Prj* pPrjFound = NULL;
+ SByteStringList* pPrjDeps;
+
+ for ( USHORT i = 0; i < nCount_l; i++ )
+ {
+ pPrj = GetObject( i );
+ if ( pPrj->GetProjectName() == aProjectName )
+ pPrjFound = pPrj;
+ else
+ {
+ pPrjDeps = pPrj->GetDependencies( FALSE );
+ if ( pPrjDeps )
+ {
+ ByteString* pString;
+ ULONG nPrjDepsCount = pPrjDeps->Count();
+ for ( ULONG j = nPrjDepsCount; j > 0; j-- )
+ {
+ pString = pPrjDeps->GetObject( j - 1 );
+ if ( pString->GetToken( 0, '.') == aProjectName )
+ pPrjDeps->Remove( pString );
+ }
+ }
+ }
+ }
+
+ Remove( pPrjFound );
+
+ return pPrjFound;
+}
+
+//
+// class StarFile
+//
+
+/*****************************************************************************/
+StarFile::StarFile( const String &rFile )
+/*****************************************************************************/
+ : aFileName( rFile )
+{
+ DirEntry aEntry( aFileName );
+ if ( aEntry.Exists()) {
+ bExists = TRUE;
+ FileStat aStat( aEntry );
+ aDate = aStat.DateModified();
+ aTime = aStat.TimeModified();
+ aDateCreated = aStat.DateCreated();
+ aTimeCreated = aStat.TimeCreated();
+ }
+ else
+ bExists = FALSE;
+}
+
+/*****************************************************************************/
+BOOL StarFile::NeedsUpdate()
+/*****************************************************************************/
+{
+ DirEntry aEntry( aFileName );
+ if ( aEntry.Exists()) {
+ if ( !bExists ) {
+ bExists = TRUE;
+ return TRUE;
+ }
+ FileStat aStat( aEntry );
+ if (( aStat.DateModified() != aDate ) || ( aStat.TimeModified() != aTime )
+ || ( aStat.DateCreated() != aDateCreated ) || ( aStat.TimeCreated() != aTimeCreated ))
+ return TRUE;
+ }
+ return FALSE;
+}