blob: aa199b4dc208b46b1caa999dc413593e4f2825ae [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <soldep/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;
// sal_uInt16 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";
// sal_uInt16 nPos = 0;
sal_Bool bFound = sal_False;
ByteString aEraseString;
for ( sal_uInt16 i = 0; i<= nLength; i++)
{
if ( aTmpStr.GetChar( i ) == 0x20 && !bFound )
aTmpStr.SetChar( i, 0x09 );
}
return aTmpStr;
}
/*****************************************************************************/
ByteString SimpleConfig::GetCleanedNextLine( sal_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;
sal_Bool bDepList;
rStream >> bDepList;
if (pDepList)
pDepList->CleanUp();
if (bDepList)
{
if (!pDepList)
pDepList = new SByteStringList();
*pDepList << rStream;
}
else
{
if (pDepList)
DELETEZ (pDepList);
}
sal_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;
sal_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;
}
/*****************************************************************************/
sal_uIntPtr SDepInfoList::IsString( ByteString* pStr )
/*****************************************************************************/
{
sal_uIntPtr 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;
}
/*****************************************************************************/
sal_uIntPtr SDepInfoList::GetPrevString( ByteString* pStr )
/*****************************************************************************/
{
sal_uIntPtr nRet = 0;
sal_Bool bFound = sal_False;
sal_uIntPtr nCount_l = Count();
sal_uIntPtr nUpper = nCount_l;
sal_uIntPtr nLower = 0;
sal_uIntPtr nCurrent = nUpper / 2;
sal_uIntPtr 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;
}
/*****************************************************************************/
sal_uIntPtr SDepInfoList::PutString( ByteString* pStr)
/*****************************************************************************/
{
return PutString( pStr, NULL);
}
/**************************************************************************
*
* Sortiert einen ByteString in die Liste ein und gibt die Position,
* an der einsortiert wurde, zurueck
*
**************************************************************************/
sal_uIntPtr SDepInfoList::PutString( ByteString* pStr, ByteString* pModeStr)
{
if (pAllModeList)
{
delete pAllModeList;
pAllModeList = NULL;
}
sal_uIntPtr 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, (sal_uIntPtr)0 );
}
return (sal_uIntPtr)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 (sal_uIntPtr)0;
}
}
delete pStr;
if (pModeStr)
delete pModeStr;
return NOT_THERE;
}
/*****************************************************************************/
ByteString* SDepInfoList::RemoveString( const ByteString& rName )
/*****************************************************************************/
{
sal_uIntPtr 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 )
/*****************************************************************************/
{
sal_uIntPtr nCount_l;
rStream >> nCount_l;
for ( sal_uInt16 i = 0; i < nCount_l; i++ ) {
DepInfo* pDepInfo = new DepInfo();
*pDepInfo << rStream;
Insert (pDepInfo, LIST_APPEND);
}
return *this;
}
/*****************************************************************************/
SDepInfoList& SDepInfoList::operator>> ( SvStream& rStream )
/*****************************************************************************/
{
sal_uIntPtr nCount_l = Count();
rStream << nCount_l;
DepInfo* pDepInfo = First();
while (pDepInfo) {
*pDepInfo >> rStream;
pDepInfo = Next();
}
return *this;
}
/*****************************************************************************/
CommandData* Prj::GetDirectoryList ( sal_uInt16 nWhatOS, sal_uInt16 nCommand )
/*****************************************************************************/
{
return (CommandData *)NULL;
}
/*****************************************************************************/
CommandData* Prj::GetDirectoryData( ByteString aLogFileName )
/*****************************************************************************/
{
PrjList* pPrjList = GetCommandDataList ();
CommandData *pData = NULL;
sal_uIntPtr nCount_l = pPrjList->Count();
for ( sal_uIntPtr 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( sal_False ),
bHardDependencies( sal_False ),
bFixedDependencies( sal_False ),
bVisited( sal_False ),
bIsAvailable( sal_True ),
pTempCommandDataList (0),
bTempCommandDataListPermanent (sal_False),
bError (sal_False)
/*****************************************************************************/
{
}
/*****************************************************************************/
Prj::Prj( ByteString aName ) :
aProjectName( aName ),
pPrjInitialDepList(0),
pPrjDepList(0),
pPrjDepInfoList(0),
bSorted( sal_False ),
bHardDependencies( sal_False ),
bFixedDependencies( sal_False ),
bVisited( sal_False ),
bIsAvailable( sal_True ),
pTempCommandDataList (0),
bTempCommandDataListPermanent (sal_False),
bError (sal_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( sal_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
{
sal_Bool bStringFound = sal_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 = sal_True;
break;
}
pDefModString = pModList->Next();
}
if (bStringFound)
break;
pModString = pDepList->Next();
}
}
pInfo = pPrjDepInfoList->Next();
}
}
/*****************************************************************************/
sal_Bool Prj::InsertDirectory ( ByteString aDirName, sal_uInt16 aWhat,
sal_uInt16 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 sal_False;
}
/*****************************************************************************/
//
// removes directory and existing dependencies on it
//
CommandData* Prj::RemoveDirectory ( ByteString aLogFileName )
/*****************************************************************************/
{
PrjList* pPrjList = GetCommandDataList ();
sal_uIntPtr nCount_l = pPrjList->Count();
CommandData* pData;
CommandData* pDataFound = NULL;
SByteStringList* pDataDeps;
for ( sal_uInt16 i = 0; i < nCount_l; i++ )
{
pData = pPrjList->GetObject( i );
if ( pData->GetLogFile() == aLogFileName )
pDataFound = pData;
else
{
pDataDeps = pData->GetDependencies();
if ( pDataDeps )
{
ByteString* pString;
sal_uIntPtr nDataDepsCount = pDataDeps->Count();
for ( sal_uIntPtr 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()
/*****************************************************************************/
{
sal_uIntPtr 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;
sal_uIntPtr 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;
sal_Bool bDepList;
rStream >> bDepList;
DELETEZ (pPrjDepInfoList);
if (bDepList)
{
pPrjDepInfoList = new SDepInfoList();
*pPrjDepInfoList << rStream;
}
sal_uIntPtr nCount_l;
rStream >> nCount_l;
for ( sal_uInt16 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, sal_uInt16 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 )
/*****************************************************************************/
: pDepMode (NULL),
pAllDepMode (NULL)
{
UpdateFileList (pStandLst, rVersion, sal_True );
}
/*****************************************************************************/
void Star::UpdateFileList( GenericInformationList *pStandLst, ByteString &rVersion,
sal_Bool bRead )
/*****************************************************************************/
{
sSourceRoot=String::CreateFromAscii(""); // clear old SourceRoot
ByteString sPath( rVersion );
#ifdef UNX
sPath += "/settings/UNXSOLARLIST";
#else
sPath += "/settings/SOLARLIST";
#endif
GenericInformation *pInfo = pStandLst->GetInfo( sPath, sal_True );
if( pInfo && pInfo->GetValue().Len()) {
ByteString sFile( pInfo->GetValue());
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, sal_True );
if ( pInfo_l && pInfo_l->GetSubList()) {
GenericInformationList *pDrives = pInfo_l->GetSubList();
for ( sal_uIntPtr i = 0; i < pDrives->Count(); i++ ) {
GenericInformation *pDrive = pDrives->GetObject( i );
if ( pDrive ) {
DirEntry aEntry;
sal_Bool bOk = sal_False;
if ( sSourceRoot.Len()) {
aEntry = DirEntry( sSourceRoot );
bOk = sal_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 = sal_True;
}
#else
bOk = sal_True;
String sRoot( *pDrive, RTL_TEXTENCODING_ASCII_US );
sRoot += String::CreateFromAscii( "\\" );
aEntry = DirEntry( sRoot );
#endif
}
if ( bOk ) {
sPath = "projects";
GenericInformation *pProjectsKey = pDrive->GetSubInfo( sPath, sal_True );
if ( pProjectsKey ) {
if ( !sSourceRoot.Len()) {
sPath = rVersion;
sPath += "/settings/PATH";
GenericInformation *pPath = pStandLst->GetInfo( sPath, sal_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, sal_True );
sal_Bool bShortPath = sal_False;
if (pShortPath && (pShortPath->GetValue() == "_TRUE"))
bShortPath = sal_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 = sal_True; // read new list because old list is deleted
}
if (bRead)
Read( pFileList );
else
GenerateFileLoadList( pFileList );
}
}
/*****************************************************************************/
void Star::FullReload( GenericInformationList *pStandLst, ByteString &rVersion,
sal_Bool bRead )
/*****************************************************************************/
{
ClearAvailableDeps();
ClearCurrentDeps();
ClearLoadedFilesList();
RemoveAllPrj();
UpdateFileList( pStandLst, rVersion, bRead );
}
/*****************************************************************************/
sal_Bool Star::CheckFileLoadList(SolarFileList *pSolarFiles)
/*****************************************************************************/
{
sal_Bool bRet = sal_True;
if (aLoadedFilesList.Count() == 0)
return bRet;
StarFile * pLoadFile = aLoadedFilesList.First();
while (pLoadFile)
{
sal_Bool bIsAvailable = sal_False;
String * pFile = pSolarFiles->First();
while (pFile)
{
if (*pFile == pLoadFile->GetName())
{
bIsAvailable = sal_True;
break;
}
pFile = pSolarFiles->Next();
}
if (!bIsAvailable)
{
bRet = sal_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(( sal_uIntPtr ) 0 ));
aMutex.acquire();
sal_uIntPtr 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(( sal_uIntPtr ) 0 );
delete pFile;
}
delete pSolarFiles;
if (pNewSolarFiles)
Read (pNewSolarFiles);
}
/*****************************************************************************/
SolarFileList* Star::NeedsFilesForUpdate()
/*****************************************************************************/
{
aMutex.acquire();
SolarFileList* pPrjList = NULL;
for ( sal_uIntPtr 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;
}
/*****************************************************************************/
sal_Bool Star::NeedsUpdate()
/*****************************************************************************/
{
aMutex.acquire();
for ( sal_uIntPtr i = 0; i < aLoadedFilesList.Count(); i++ )
if ( aLoadedFilesList.GetObject( i )->NeedsUpdate()) {
aMutex.release();
return sal_True;
}
aMutex.release();
return sal_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(( sal_uIntPtr ) 0 );
StarFile* pFile = ReadBuildlist (ssFileName);
aMutex.acquire();
ReplaceFileEntry (&aLoadedFilesList, pFile);
//aLoadedFilesList.Insert( pFile, LIST_APPEND );
aMutex.release();
aFileList.Remove(( sal_uIntPtr ) 0 );
}
// resolve all dependencies recursive
Expand_Impl();
}
/*****************************************************************************/
sal_uIntPtr Star::SearchFileEntry( StarFileList *pStarFiles, StarFile* pFile )
/*****************************************************************************/
{
StarFile *pSearchFile;
sal_uIntPtr nCount_l;
nCount_l = pStarFiles->Count();
for ( sal_uIntPtr 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 )
/*****************************************************************************/
{
sal_uIntPtr 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(( sal_uIntPtr ) 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 (sal_False);
}
}
aMutex.acquire();
ReplaceFileEntry (&aLoadedFilesList, pFile);
//aLoadedFilesList.Insert( pFile, LIST_APPEND );
aMutex.release();
delete pSolarFiles->Remove(( sal_uIntPtr ) 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 ( sal_uIntPtr 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 = sal_True;
SByteStringList* pPrjLst = pPrj->GetDependencies();
SByteStringList* pDepLst = NULL;
ByteString* pDepend;
ByteString* pPutStr;
Prj *pNextPrj = NULL;
sal_uIntPtr 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 ( sal_uIntPtr i = 0; i < Count(); i++ ) {
for ( sal_uIntPtr j = 0; j < Count(); j++ )
GetObject( j )->bVisited = sal_False;
Prj* pPrj = GetObject( i );
pPrj->SetMode(pDepMode); // DepList für Mode initialisieren
ExpandPrj_Impl( pPrj, pPrj );
}
}
/*****************************************************************************/
StarFile* Star::ReadBuildlist (const String& rFilename, sal_Bool bReadComments, sal_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;
sal_Bool bPrjDep = sal_False;
sal_Bool bHardDep = sal_False;
sal_Bool bFixedDep = sal_False;
sal_Bool bNewProject = sal_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 = sal_True;
bHardDep = sal_False;
bFixedDep = sal_False;
i = 9;
}
else if ( sToken.CompareTo("::") == COMPARE_EQUAL )
{
bPrjDep = sal_True;
bHardDep = sal_True;
bFixedDep = sal_False;
i = 9;
}
else if ( sToken.CompareTo(":::") == COMPARE_EQUAL )
{
bPrjDep = sal_True;
bHardDep = sal_True;
bFixedDep = sal_True;
i = 9;
}
else
{
bPrjDep = sal_False;
bHardDep = sal_False;
bFixedDep = sal_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= sal_False;
}
else
{
ByteString sMode;
sal_Bool bHasModes = sal_False;
if (aItem.Search(":") != STRING_NOTFOUND)
{
sMode = aItem.GetToken ( 0, ':');
aItem = aItem.GetToken ( 1, ':');
bHasModes = sal_True;
}
if (!pPrj)
{
// neues Project anlegen
pPrj = new Prj ( aProjectName );
pPrj->SetPreFix( aPrefix );
bNewProject = sal_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 = sal_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 = sal_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;
}
/*****************************************************************************/
sal_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 sal_True;
}
return sal_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 ;
}
/*****************************************************************************/
sal_Bool Star::RemovePrj ( Prj* pPrj )
/*****************************************************************************/
{
sal_uIntPtr nPos = GetPos(pPrj);
if (nPos != LIST_ENTRY_NOTFOUND) {
delete pPrj;
Remove(nPos);
return sal_True;
}
return sal_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());
sal_uInt16 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( sal_True );
//
// aDepType = ByteString(DEP_MD_FORCE_STR);
// if (mpXmlBuildList->hasModuleDepType(aProducts, aDepType))
// {
// pPrj->HasHardDependencies( sal_True );
// pPrj->HasFixedDependencies( sal_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 unterstützt
// // mehr geht wegen der Struktur zur Zeit nicht!
// // lese sie trotzdem kommasepariert ein, wenn nötig
// 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 löschen
// 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 {
sal_uIntPtr 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
sal_uIntPtr 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;
sal_uIntPtr 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();
sal_Bool bFullList;
rStream >> bFullList;
if (bFullList)
{
rStream >> nStarMode;
sal_Bool bDepMode;
rStream >> bDepMode;
if (pDepMode)
pDepMode->CleanUp();
if (bDepMode)
{
if (!pDepMode)
pDepMode = new SByteStringList();
*pDepMode << rStream;
}
else
DELETEZ (pDepMode);
}
sal_uIntPtr nCount_l;
rStream >> nCount_l;
for ( sal_uInt16 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, sal_Bool bReadComments, sal_uInt16 nMode )
/*****************************************************************************/
: Star ()
{
sFileName = aFileName;
Read ( aFileName, bReadComments, nMode );
}
/*****************************************************************************/
StarWriter::StarWriter( SolarFileList *pSolarFiles, sal_Bool bReadComments )
/*****************************************************************************/
: Star ()
{
Read( pSolarFiles, bReadComments );
}
/*****************************************************************************/
StarWriter::StarWriter( GenericInformationList *pStandLst, ByteString &rVersion,
ByteString &rMinor, sal_Bool bReadComments )
/*****************************************************************************/
: Star ()
{
ByteString sPath( rVersion );
#ifdef UNX
sPath += "/settings/UNXSOLARLIST";
#else
sPath += "/settings/SOLARLIST";
#endif
GenericInformation *pInfo_l = pStandLst->GetInfo( sPath, sal_True );
if( pInfo_l && pInfo_l->GetValue().Len()) {
ByteString sFile( pInfo_l->GetValue());
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, sal_True );
if ( pInfo_k && pInfo_k->GetSubList()) {
GenericInformationList *pDrives = pInfo_k->GetSubList();
for ( sal_uIntPtr i = 0; i < pDrives->Count(); i++ ) {
GenericInformation *pDrive = pDrives->GetObject( i );
if ( pDrive ) {
DirEntry aEntry;
sal_Bool bOk = sal_False;
if ( sSourceRoot.Len()) {
aEntry = DirEntry( sSourceRoot );
bOk = sal_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 = sal_True;
}
#else
bOk = sal_True;
String sRoot( *pDrive, RTL_TEXTENCODING_ASCII_US );
sRoot += String::CreateFromAscii( "\\" );
aEntry = DirEntry( sRoot );
#endif
}
if ( bOk ) {
sPath = "projects";
GenericInformation *pProjectsKey = pDrive->GetSubInfo( sPath, sal_True );
if ( pProjectsKey ) {
if ( !sSourceRoot.Len()) {
sPath = rVersion;
sPath += "/settings/PATH";
GenericInformation *pPath = pStandLst->GetInfo( sPath, sal_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, sal_True );
sal_Bool bShortPath = sal_False;
if (pShortPath && (pShortPath->GetValue() == "_TRUE"))
bShortPath = sal_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();
}
/*****************************************************************************/
sal_uInt16 StarWriter::Read( String aFileName, sal_Bool bReadComments, sal_uInt16 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(( sal_uIntPtr ) 0 );
StarFile* pFile = ReadBuildlist (ssFileName, bReadComments, sal_False);
aMutex.acquire();
aLoadedFilesList.Insert( pFile, LIST_APPEND );
aMutex.release();
delete aFileList.Remove(( sal_uIntPtr ) 0 );
}
// resolve all dependencies recursive
Expand_Impl();
// Die gefundenen Abhaengigkeiten rekursiv aufloesen
Expand_Impl();
return 0;
}
/*****************************************************************************/
sal_uInt16 StarWriter::Read( SolarFileList *pSolarFiles, sal_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(( sal_uIntPtr ) 0 );
StarFile* pFile = ReadBuildlist(ssFileName, bReadComments, sal_False);
aMutex.acquire();
aLoadedFilesList.Insert( pFile, LIST_APPEND );
aMutex.release();
delete pSolarFiles->Remove(( sal_uIntPtr ) 0 );
}
delete pSolarFiles;
Expand_Impl();
return 0;
}
/*****************************************************************************/
sal_uInt16 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( sal_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 ( sal_uInt16 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;
sal_uInt16 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 ( sal_uInt16 i = 0; i< pCmdDepList->Count(); i++ ) {
aDataString += *pCmdDepList->GetObject( i );
aDataString += aSpace;
}
aDataString += "NULL";
}
rStream.WriteLine( aDataString );
pCmdData = pPrj->Next();
} while ( pCmdData );
}
}
return 0;
}
/*****************************************************************************/
sal_uInt16 StarWriter::Write( String aFileName )
/*****************************************************************************/
{
sFileName = aFileName;
FileStat::SetReadOnlyFlag( DirEntry( aFileName ), sal_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;
}
/*****************************************************************************/
sal_uInt16 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, sal_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 );
}
/*****************************************************************************/
sal_Bool StarWriter::InsertProject ( Prj* /*pNewPrj*/ )
/*****************************************************************************/
{
return sal_False;
}
/*****************************************************************************/
Prj* StarWriter::RemoveProject ( ByteString aProjectName )
/*****************************************************************************/
{
sal_uIntPtr nCount_l = Count();
Prj* pPrj;
Prj* pPrjFound = NULL;
SByteStringList* pPrjDeps;
for ( sal_uInt16 i = 0; i < nCount_l; i++ )
{
pPrj = GetObject( i );
if ( pPrj->GetProjectName() == aProjectName )
pPrjFound = pPrj;
else
{
pPrjDeps = pPrj->GetDependencies( sal_False );
if ( pPrjDeps )
{
ByteString* pString;
sal_uIntPtr nPrjDepsCount = pPrjDeps->Count();
for ( sal_uIntPtr 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 = sal_True;
FileStat aStat( aEntry );
aDate = aStat.DateModified();
aTime = aStat.TimeModified();
aDateCreated = aStat.DateCreated();
aTimeCreated = aStat.TimeCreated();
}
else
bExists = sal_False;
}
/*****************************************************************************/
sal_Bool StarFile::NeedsUpdate()
/*****************************************************************************/
{
DirEntry aEntry( aFileName );
if ( aEntry.Exists()) {
if ( !bExists ) {
bExists = sal_True;
return sal_True;
}
FileStat aStat( aEntry );
if (( aStat.DateModified() != aDate ) || ( aStat.TimeModified() != aTime )
|| ( aStat.DateCreated() != aDateCreated ) || ( aStat.TimeCreated() != aTimeCreated ))
return sal_True;
}
return sal_False;
}