xref: /aoo4110/main/soldep/bootstrp/prj.cxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <soldep/sstring.hxx>
26 #include <vos/mutex.hxx>
27 
28 #define ENABLE_BYTESTRING_STREAM_OPERATORS
29 #include <tools/stream.hxx>
30 #include <tools/geninfo.hxx>
31 #include <soldep/prj.hxx>
32 //#include <bootstrp/inimgr.hxx>
33 
34 #ifndef MACOSX
35 #pragma hdrstop
36 #endif
37 
38 //#define TEST 	1
39 
40 #if defined(WNT) || defined(OS2)
41 #define LIST_DELIMETER ';'
42 #else
43 #ifdef UNX
44 #define LIST_DELIMETER ':'
45 #else
46 #endif
47 #endif
48 
49 #if defined(WNT) || defined(OS2)
50 #define PATH_DELIMETER '\\'
51 #else
52 #ifdef UNX
53 #define PATH_DELIMETER '/'
54 #else
55 #endif
56 #endif
57 
58 //static const char * XML_ALL  =	"all";
59 
60 //
61 //	class SimpleConfig
62 //
63 
64 /*****************************************************************************/
SimpleConfig(String aSimpleConfigFileName)65 SimpleConfig::SimpleConfig( String aSimpleConfigFileName )
66 /*****************************************************************************/
67 {
68 	nLine = 0;
69 	aFileName = aSimpleConfigFileName;
70 	aFileStream.Open ( aFileName, STREAM_READ );
71 }
72 
73 /*****************************************************************************/
SimpleConfig(DirEntry & rDirEntry)74 SimpleConfig::SimpleConfig( DirEntry& rDirEntry )
75 /*****************************************************************************/
76 {
77 	nLine = 0;
78 	aFileName = rDirEntry.GetFull();
79 	aFileStream.Open ( aFileName, STREAM_READ );
80 }
81 
82 /*****************************************************************************/
~SimpleConfig()83 SimpleConfig::~SimpleConfig()
84 /*****************************************************************************/
85 {
86 	aFileStream.Close ();
87 }
88 
89 /*****************************************************************************/
GetNext()90 ByteString SimpleConfig::GetNext()
91 /*****************************************************************************/
92 {
93 	ByteString aString;
94 
95 	if ( aStringBuffer =="" )
96 	  while ((aStringBuffer = GetNextLine()) == "\t"); //solange bis != "\t"
97 	if ( aStringBuffer =="" )
98 		return ByteString();
99 
100 	aString = aStringBuffer.GetToken(0,'\t');
101 	aStringBuffer.Erase(0, aString.Len()+1);
102 
103 	aStringBuffer.EraseLeadingChars( '\t' );
104 
105 	return aString;
106 }
107 
108 /*****************************************************************************/
GetNextLine()109 ByteString	SimpleConfig::GetNextLine()
110 /*****************************************************************************/
111 {
112 	ByteString aSecStr;
113     sal_Bool bStreamOk;
114 //	sal_uInt16 iret = 0;
115 	nLine++;
116 
117 	bStreamOk = aFileStream.ReadLine ( aTmpStr );
118 	if ( (aTmpStr.Search( "#" ) == 0) )
119 		return "\t";
120 	aTmpStr = aTmpStr.EraseLeadingChars();
121 	aTmpStr = aTmpStr.EraseTrailingChars();
122 	while ( aTmpStr.SearchAndReplace(ByteString(' '),ByteString('\t') ) != STRING_NOTFOUND );
123 	int nLength = aTmpStr.Len();
124     if ( bStreamOk && (nLength == 0) )
125 		return "\t";
126 //	sal_uInt16 nPos = 0;
127 	sal_Bool bFound = sal_False;
128 	ByteString aEraseString;
129 	for ( sal_uInt16 i = 0; i<= nLength; i++)
130 	{
131 		if ( aTmpStr.GetChar( i ) == 0x20  && !bFound )
132 			aTmpStr.SetChar( i, 0x09 );
133 	}
134 	return aTmpStr;
135 }
136 
137 /*****************************************************************************/
GetCleanedNextLine(sal_Bool bReadComments)138 ByteString SimpleConfig::GetCleanedNextLine( sal_Bool bReadComments )
139 /*****************************************************************************/
140 {
141 	sal_Bool bStreamOk;
142 	sal_Bool bReadNextLine = sal_True;
143 	while (bReadNextLine)
144 	{
145 		bStreamOk = aFileStream.ReadLine ( aTmpStr );
146 		if (!bStreamOk)
147 			return ByteString();
148 
149 		ByteString sTab = "\t";
150 		ByteString sDoubleTab = "\t\t";
151 		ByteString sSpace = " ";
152 		xub_StrLen nIndex = 0;
153 
154 		aTmpStr.SearchAndReplaceAll(sSpace, sTab);
155 		while ( (nIndex = aTmpStr.SearchAndReplace(sDoubleTab, sTab, nIndex )) != STRING_NOTFOUND );
156 
157 		aTmpStr = aTmpStr.EraseLeadingAndTrailingChars('\t'); // remove tabs
158 
159 		if ( aTmpStr.Search( "#" ) == 0 )
160 		{
161 			if (bReadComments )
162 				return aTmpStr;
163 		}
164         else if (aTmpStr != ByteString::EmptyString())
165 			bReadNextLine = sal_False;
166 	}
167 
168 	return aTmpStr;
169 }
170 
171 
172 //
173 //	class CommandData
174 //
175 
176 /*****************************************************************************/
CommandData()177 CommandData::CommandData()
178 /*****************************************************************************/
179 {
180 	nOSType = 0;
181 	nCommand = 0;
182 	pDepList = 0;
183 	pCommandList = 0;
184 }
185 
186 /*****************************************************************************/
~CommandData()187 CommandData::~CommandData()
188 /*****************************************************************************/
189 {
190 	if ( pDepList )
191 	{
192 		ByteString *pString = pDepList->First();
193 		while ( pString )
194 		{
195 			delete pString;
196 			pString = pDepList->Next();
197 		}
198 		delete pDepList;
199 
200 		pDepList = NULL;
201 	}
202 	if ( pCommandList )
203 	{
204 		ByteString *pString = pCommandList->First();
205 		while ( pString )
206 		{
207 			delete pString;
208 			pString = pCommandList->Next();
209 		}
210 		delete pCommandList;
211 
212 		pCommandList = NULL;
213 	}
214 }
215 
216 /*****************************************************************************/
GetOSTypeString()217 ByteString CommandData::GetOSTypeString()
218 /*****************************************************************************/
219 {
220 	ByteString aRetStr;
221 
222 	switch (nOSType)
223 	{
224 		case OS_WIN16 | OS_WIN32 | OS_OS2 | OS_UNX | OS_MAC :
225 			aRetStr = "all";
226 			break;
227 		case OS_WIN32 | OS_WIN16 :
228 			aRetStr = "w";
229 			break;
230 		case OS_OS2 :
231 			aRetStr = "p";
232 			break;
233 		case OS_UNX :
234 			aRetStr = "u";
235 			break;
236 		case OS_WIN16 :
237 			aRetStr = "d";
238 			break;
239 		case OS_WIN32 :
240 			aRetStr = "n";
241 			break;
242 		case OS_MAC :
243 			aRetStr = "m";
244 			break;
245 		default :
246 			aRetStr = "none";
247 	}
248 
249 	return aRetStr;
250 }
251 
252 /*****************************************************************************/
GetCommandTypeString()253 ByteString CommandData::GetCommandTypeString()
254 /*****************************************************************************/
255 {
256 	ByteString aRetStr;
257 
258 	switch (nCommand)
259 	{
260 		case COMMAND_NMAKE :
261 			aRetStr = "nmake";
262 			break;
263 		case COMMAND_GET :
264 			aRetStr = "get";
265 			break;
266 		default :
267 			aRetStr = "usr";
268 			aRetStr += ByteString::CreateFromInt64( nCommand + 1 - COMMAND_USER_START );
269 
270 	}
271 
272 	return aRetStr;
273 }
274 
275 /*****************************************************************************/
AddCommand(ByteString * pCommand)276 void CommandData::AddCommand(ByteString* pCommand)
277 /*****************************************************************************/
278 {
279 	if (!pCommandList)
280 		pCommandList = new SByteStringList();
281 	pCommandList->Insert(pCommand, LIST_APPEND);
282 }
283 
284 /*****************************************************************************/
operator >>(SvStream & rStream)285 CommandData& CommandData::operator>>  ( SvStream& rStream )
286 /*****************************************************************************/
287 {
288 	rStream << aPrj;
289 	rStream << aLogFileName;
290 	rStream << aInpath;
291 	rStream << aUpd;
292 	rStream << aUpdMinor;
293 	rStream << aProduct;
294 	rStream << aCommand;
295 	rStream << aPath;
296 	rStream << aPrePath;
297 	rStream << aPreFix;
298 	rStream << aCommandPara;
299 	rStream << aComment;
300 	rStream << sClientRestriction;
301 
302 	rStream << nOSType;
303 	rStream << nCommand;
304 	rStream << nDepth;
305 
306 	if (pDepList)
307 	{
308 		rStream << sal_True;
309 		*pDepList >> rStream;
310 	}
311 	else
312 		rStream << sal_False;
313 
314 	if (pCommandList)
315 	{
316 		rStream << sal_True;
317 		*pCommandList >> rStream;
318 	}
319 	else
320 		rStream << sal_False;
321 
322 	return *this;
323 }
324 
325 /*****************************************************************************/
operator <<(SvStream & rStream)326 CommandData& CommandData::operator<<  ( SvStream& rStream )
327 /*****************************************************************************/
328 {
329 	rStream >> aPrj;
330 	rStream >> aLogFileName;
331 	rStream >> aInpath;
332 	rStream >> aUpd;
333 	rStream >> aUpdMinor;
334 	rStream >> aProduct;
335 	rStream >> aCommand;
336 	rStream >> aPath;
337 	rStream >> aPrePath;
338 	rStream >> aPreFix;
339 	rStream >> aCommandPara;
340 	rStream >> aComment;
341 	rStream >> sClientRestriction;
342 
343 	rStream >> nOSType;
344 	rStream >> nCommand;
345 	rStream >> nDepth;
346 
347 	sal_Bool bDepList;
348 	rStream >> bDepList;
349 	if (pDepList)
350 		pDepList->CleanUp();
351 	if (bDepList)
352 	{
353 		if (!pDepList)
354 			pDepList = new SByteStringList();
355 		*pDepList << rStream;
356 	}
357 	else
358 	{
359 		if (pDepList)
360 		DELETEZ (pDepList);
361 	}
362 
363 	sal_Bool bCommandList;
364 	rStream >> bCommandList;
365 	if (pCommandList)
366 		pCommandList->CleanUp();
367 	if (bCommandList)
368 	{
369 		if (!pCommandList)
370 			pCommandList = new SByteStringList();
371 		*pCommandList << rStream;
372 	}
373 	else
374 	{
375 		if (pCommandList)
376 			DELETEZ (pCommandList);
377 	}
378 
379 	return *this;
380 }
381 
382 
383 
384 //
385 // class DepInfo
386 //
387 
388 /*****************************************************************************/
~DepInfo()389 DepInfo::~DepInfo()
390 /*****************************************************************************/
391 {
392 	RemoveProject();
393 
394 	if ( pModeList )
395 	{
396 		ByteString *pString = pModeList->First();
397 		while ( pString )
398 		{
399 			delete pString;
400 			pString = pModeList->Next();
401 		}
402 		delete pModeList;
403 
404 		pModeList = NULL;
405 	}
406 }
407 
408 /*****************************************************************************/
SetProject(ByteString * pStr)409 void DepInfo::SetProject (ByteString* pStr)
410 /*****************************************************************************/
411 {
412 	RemoveProject();
413 	pProject = pStr;
414 }
415 
416 /*****************************************************************************/
RemoveProject()417 void DepInfo::RemoveProject ()
418 /*****************************************************************************/
419 {
420 	if (pProject)
421 	{
422 		delete pProject;
423 		pProject = NULL;
424 	}
425 }
426 
427 /*****************************************************************************/
operator <<(SvStream & rStream)428 DepInfo& DepInfo::operator<<  ( SvStream& rStream )
429 /*****************************************************************************/
430 {
431 	RemoveProject();
432 	pProject = new ByteString();
433 	rStream >> *pProject;
434 
435 	sal_Bool bModeList;
436 	rStream >> bModeList;
437 	if (pModeList)
438 		pModeList->CleanUp();
439 	if (bModeList)
440 	{
441 		if (!pModeList)
442 			pModeList = new SByteStringList();
443 		*pModeList << rStream;
444 	}
445 	else
446 		DELETEZ (pModeList);
447 
448 	rStream >> bAllModes;
449 	return *this;
450 }
451 
452 /*****************************************************************************/
operator >>(SvStream & rStream)453 DepInfo& DepInfo::operator>>  ( SvStream& rStream )
454 /*****************************************************************************/
455 {
456 	rStream << *pProject;
457 	if (pModeList)
458 	{
459 		rStream << sal_True;
460 		*pModeList >> rStream;
461 	}
462 	else
463 		rStream << sal_False;
464 	rStream << bAllModes;
465 
466 	return *this;
467 }
468 
469 //
470 // class SDepInfoList
471 //
472 
473 /*****************************************************************************/
SDepInfoList()474 SDepInfoList::SDepInfoList()
475 /*****************************************************************************/
476 								: pAllModeList(0)
477 {
478 }
479 
480 /*****************************************************************************/
~SDepInfoList()481 SDepInfoList::~SDepInfoList()
482 /*****************************************************************************/
483 {
484 	if (pAllModeList)
485 		delete pAllModeList;
486 }
487 
488 /*****************************************************************************/
IsString(ByteString * pStr)489 sal_uIntPtr SDepInfoList::IsString( ByteString* pStr )
490 /*****************************************************************************/
491 {
492 	sal_uIntPtr nRet = NOT_THERE;
493 	if ( (nRet = GetPrevString( pStr )) != 0 )
494 	{
495 		ByteString* pString = GetObject( nRet )->GetProject();
496 		if ( *pString == *pStr )
497 			return nRet;
498 		else
499 			return NOT_THERE;
500 	}
501 	else
502 	{
503 		ByteString* pString = GetObject( 0 )->GetProject();
504 		if ( pString && (*pString == *pStr) )
505 			return 0;
506 		else
507 			return NOT_THERE;
508 	}
509 	return nRet;
510 }
511 
512 /*****************************************************************************/
GetPrevString(ByteString * pStr)513 sal_uIntPtr SDepInfoList::GetPrevString( ByteString* pStr )
514 /*****************************************************************************/
515 {
516 	sal_uIntPtr nRet = 0;
517 	sal_Bool bFound = sal_False;
518 	sal_uIntPtr nCount_l = Count();
519 	sal_uIntPtr nUpper = nCount_l;
520 	sal_uIntPtr nLower = 0;
521 	sal_uIntPtr nCurrent = nUpper / 2;
522 	sal_uIntPtr nRem = 0;
523 	ByteString* pString;
524 
525 	do
526 	{
527 		if ( (nCurrent == nLower) || (nCurrent == nUpper) )
528 			return nLower;
529 		pString = GetObject( nCurrent )->GetProject();
530 		int nResult =  pStr->CompareTo( *pString );
531 		if ( nResult == COMPARE_LESS )
532 		{
533 			nUpper = nCurrent;
534 			nCurrent = (nCurrent + nLower) /2;
535 		}
536 		else if ( nResult == COMPARE_GREATER )
537 		{
538 			nLower = nCurrent;
539 			nCurrent = (nUpper + nCurrent) /2;
540 		}
541 		else if ( nResult == COMPARE_EQUAL )
542 			return nCurrent;
543 		if ( nRem == nCurrent )
544 			return nCurrent;
545 		nRem = nCurrent;
546 	}
547 	while ( !bFound );
548 	return nRet;
549 }
550 
551 /*****************************************************************************/
PutModeString(DepInfo * pInfoList,ByteString * pStr)552 void SDepInfoList::PutModeString( DepInfo* pInfoList, ByteString* pStr )
553 /*****************************************************************************/
554 {
555 	SByteStringList* pList = pInfoList->GetModeList();
556 	if (!pList)
557 	{
558 		pList = new SByteStringList;
559 		pInfoList->SetModeList(pList);
560 
561 	}
562 
563 	if (pList)
564 	{
565 		// check if string exists
566 		ByteString *pString = pList->First();
567 		while ( pString )
568 		{
569 			if (*pString == *pStr)
570 			{
571 				delete pStr;
572 				return;
573 			}
574 			pString = pList->Next();
575 		}
576 		pList->PutString( pStr );
577 	}
578 	else
579 		delete pStr;
580 }
581 
582 /*****************************************************************************/
PutString(ByteString * pStr)583 sal_uIntPtr SDepInfoList::PutString( ByteString* pStr)
584 /*****************************************************************************/
585 {
586 	return PutString( pStr, NULL);
587 }
588 
589 /**************************************************************************
590 *
591 *	Sortiert einen ByteString in die Liste ein und gibt die Position,
592 *	an der einsortiert wurde, zurueck
593 *
594 **************************************************************************/
595 
PutString(ByteString * pStr,ByteString * pModeStr)596 sal_uIntPtr SDepInfoList::PutString( ByteString* pStr, ByteString* pModeStr)
597 {
598 	if (pAllModeList)
599 	{
600 		delete pAllModeList;
601 		pAllModeList = NULL;
602 	}
603 
604 	sal_uIntPtr nPos = GetPrevString ( pStr );
605 	if ( Count() )
606 	{
607 		{
608 			DepInfo* pInfo = GetObject( 0 );
609 			ByteString* pString = pInfo->GetProject();
610 			if ( pString->CompareTo( *pStr ) == COMPARE_GREATER )
611 			{
612 				pInfo = new DepInfo;
613 				if (pInfo)
614 				{
615 					pInfo->SetProject(pStr);
616 					if (pModeStr)
617 						PutModeString(pInfo, pModeStr);
618 					else
619 						pInfo->SetAllModes();
620 					Insert( pInfo, (sal_uIntPtr)0 );
621 				}
622 				return (sal_uIntPtr)0;
623 			}
624 		}
625 		ByteString* pString = GetObject( nPos )->GetProject();
626 		if ( *pStr != *pString )
627 		{
628 			DepInfo* pInfo = new DepInfo;
629 			if (pInfo)
630 			{
631 				pInfo->SetProject(pStr);
632 				if (pModeStr)
633 					PutModeString(pInfo, pModeStr);
634 				else
635 					pInfo->SetAllModes();
636 				Insert( pInfo, nPos+1 );
637 			}
638 			return ( nPos +1 );
639 		}
640 		else
641 		{
642 			delete pStr;
643 			DepInfo* pInfo = GetObject( nPos );
644 			if (pModeStr)
645 				PutModeString(pInfo, pModeStr);
646 			else
647 				pInfo->SetAllModes();
648 			return ( nPos +1 );
649 		}
650 	}
651 	else
652 	{
653 		DepInfo* pInfo = new DepInfo;
654 		if (pInfo)
655 		{
656 			pInfo->SetProject(pStr);
657 			if (pModeStr)
658 				PutModeString(pInfo, pModeStr);
659 			else
660 				pInfo->SetAllModes();
661 			Insert( pInfo);
662 			return (sal_uIntPtr)0;
663 		}
664 	}
665 
666 	delete pStr;
667 	if (pModeStr)
668 		delete pModeStr;
669 	return NOT_THERE;
670 }
671 
672 /*****************************************************************************/
RemoveString(const ByteString & rName)673 ByteString* SDepInfoList::RemoveString( const ByteString& rName )
674 /*****************************************************************************/
675 {
676 	sal_uIntPtr i;
677 	ByteString* pReturn;
678 	if (pAllModeList)
679 	{
680 		delete pAllModeList;
681 		pAllModeList = NULL;
682 	}
683 
684 	for( i = 0 ; i < Count(); i++ )
685 	{
686 		if ( rName == *(GetObject( i )->GetProject()) )
687 		{
688 			pReturn = new ByteString(*(GetObject(i)->GetProject()));
689 			DepInfo* pInfo;
690 			pInfo = GetObject(i);
691 			delete pInfo;
692 			Remove(i);
693 			return pReturn;
694 		}
695 	}
696 
697 	return NULL;
698 }
699 
700 /*****************************************************************************/
GetAllDepModes()701 SByteStringList* SDepInfoList::GetAllDepModes()
702 /*****************************************************************************/
703 {
704 	if (pAllModeList)
705 			return pAllModeList;
706 
707 	DepInfo *pInfo = First();
708 	while ( pInfo )
709 	{
710 		if (!pInfo->IsAllModes() && pInfo->GetModeList())
711 		{
712 			if (!pAllModeList)
713 				pAllModeList = new SByteStringList();
714 			ByteString* pStr = pInfo->GetModeList()->First();
715 			while (pStr)
716 			{
717 				if (pAllModeList->IsString(pStr) == NOT_THERE)
718 					pAllModeList->PutString(pStr);
719 				pStr = pInfo->GetModeList()->Next();
720 			}
721 		}
722 		pInfo = Next();
723 	}
724 	return pAllModeList;
725 }
726 
727 /*****************************************************************************/
operator <<(SvStream & rStream)728 SDepInfoList& SDepInfoList::operator<< ( SvStream& rStream )
729 /*****************************************************************************/
730 {
731 	sal_uIntPtr nCount_l;
732 	rStream >> nCount_l;
733 	for ( sal_uInt16 i = 0; i < nCount_l; i++ ) {
734         DepInfo* pDepInfo = new DepInfo();
735         *pDepInfo << rStream;
736         Insert (pDepInfo, LIST_APPEND);
737     }
738 	return *this;
739 }
740 
741 /*****************************************************************************/
operator >>(SvStream & rStream)742 SDepInfoList& SDepInfoList::operator>> ( SvStream& rStream )
743 /*****************************************************************************/
744 {
745 	sal_uIntPtr nCount_l = Count();
746 	rStream << nCount_l;
747 	DepInfo* pDepInfo = First();
748 	while (pDepInfo) {
749 		*pDepInfo >> rStream;
750 		pDepInfo = Next();
751 	}
752 
753 	return *this;
754 }
755 
756 /*****************************************************************************/
GetDirectoryList(sal_uInt16 nWhatOS,sal_uInt16 nCommand)757 CommandData* Prj::GetDirectoryList ( sal_uInt16 nWhatOS, sal_uInt16 nCommand )
758 /*****************************************************************************/
759 {
760 	return (CommandData *)NULL;
761 }
762 
763 /*****************************************************************************/
GetDirectoryData(ByteString aLogFileName)764 CommandData* Prj::GetDirectoryData( ByteString aLogFileName )
765 /*****************************************************************************/
766 {
767 	PrjList* pPrjList = GetCommandDataList ();
768 	CommandData *pData = NULL;
769 	sal_uIntPtr nCount_l = pPrjList->Count();
770 	for ( sal_uIntPtr i=0; i<nCount_l; i++ )
771 	{
772 		pData = pPrjList->GetObject(i);
773 		if ( pData->GetLogFile() == aLogFileName )
774 			return pData;
775 	}
776 	return NULL;
777 }
778 
779 //
780 //	class Prj
781 //
782 
783 /*****************************************************************************/
Prj()784 Prj::Prj() :
785 	pPrjInitialDepList(0),
786 	pPrjDepList(0),
787 	pPrjDepInfoList(0),
788 	bSorted( sal_False ),
789 	bHardDependencies( sal_False ),
790 	bFixedDependencies( sal_False ),
791 	bVisited( sal_False ),
792 	bIsAvailable( sal_True ),
793 	pTempCommandDataList (0),
794 	bTempCommandDataListPermanent (sal_False),
795 	bError (sal_False)
796 /*****************************************************************************/
797 {
798 }
799 
800 /*****************************************************************************/
Prj(ByteString aName)801 Prj::Prj( ByteString aName ) :
802 	aProjectName( aName ),
803 	pPrjInitialDepList(0),
804 	pPrjDepList(0),
805 	pPrjDepInfoList(0),
806 	bSorted( sal_False ),
807 	bHardDependencies( sal_False ),
808 	bFixedDependencies( sal_False ),
809 	bVisited( sal_False ),
810 	bIsAvailable( sal_True ),
811 	pTempCommandDataList (0),
812 	bTempCommandDataListPermanent (sal_False),
813 	bError (sal_False)
814 /*****************************************************************************/
815 {
816 }
817 
818 /*****************************************************************************/
~Prj()819 Prj::~Prj()
820 /*****************************************************************************/
821 {
822 	pPrjDepList = RemoveStringList (pPrjDepList);
823 	pPrjInitialDepList = RemoveStringList (pPrjInitialDepList);
824 	pPrjDepInfoList = RemoveDepInfoList (pPrjDepInfoList);
825 }
826 
827 /*****************************************************************************/
RemoveStringList(SByteStringList * pStringList)828 SByteStringList* Prj::RemoveStringList(SByteStringList* pStringList )
829 /*****************************************************************************/
830 {
831 	if ( pStringList )
832 	{
833 		ByteString *pString = pStringList->First();
834 		while ( pString )
835 		{
836 			delete pString;
837 			pString = pStringList->Next();
838 		}
839 
840 		delete pStringList;
841 
842 		pStringList = NULL;
843 	}
844 	return pStringList;
845 }
846 
847 /*****************************************************************************/
RemoveDepInfoList(SDepInfoList * pInfoList)848 SDepInfoList* Prj::RemoveDepInfoList(SDepInfoList* pInfoList )
849 /*****************************************************************************/
850 {
851 	if ( pInfoList )
852 	{
853 		DepInfo *pInfo = pInfoList->First();
854 		while ( pInfo )
855 		{
856 			delete pInfo;
857 			pInfo = pInfoList->Next();
858 		}
859 
860 		delete pInfoList;
861 
862 		pInfoList = NULL;
863 	}
864 	return pInfoList;
865 }
866 
867 /*****************************************************************************/
AddDependencies(ByteString aStr)868 void Prj::AddDependencies( ByteString aStr )
869 /*****************************************************************************/
870 {
871 
872 	if ( !pPrjDepInfoList )
873 		pPrjDepInfoList = new SDepInfoList;
874 
875 	pPrjDepInfoList->PutString( new ByteString(aStr) );
876 }
877 
878 /*****************************************************************************/
AddDependencies(ByteString aStr,ByteString aModeStr)879 void Prj::AddDependencies( ByteString aStr, ByteString aModeStr )
880 /*****************************************************************************/
881 {
882 
883 	// needs dirty flag - not expanded
884 	if ( !pPrjDepInfoList )
885 		pPrjDepInfoList = new SDepInfoList;
886 
887 	pPrjDepInfoList->PutString( new ByteString(aStr), new ByteString(aModeStr) );
888 }
889 
890 /*****************************************************************************/
GetDependencies(sal_Bool bExpanded)891 SByteStringList* Prj::GetDependencies( sal_Bool bExpanded )
892 /*****************************************************************************/
893 {
894 	if ( bExpanded )
895 	{
896 		if (!pPrjDepList)
897 			SetMode (NULL);
898 		return pPrjDepList;
899 	}
900 	else
901 	{
902 		if (!pPrjInitialDepList)
903 			SetMode (NULL);
904 		return pPrjInitialDepList;
905 	}
906 }
907 
908 /*****************************************************************************/
SetMode(SByteStringList * pModList)909 void Prj::SetMode(SByteStringList* pModList)
910 /*****************************************************************************/
911 {
912 	pPrjDepList = RemoveStringList (pPrjDepList);
913 	pPrjInitialDepList = RemoveStringList (pPrjInitialDepList);
914 
915 	if (!pPrjDepInfoList)
916 		return;
917 
918 	pPrjDepList = new SByteStringList;
919 	pPrjInitialDepList = new SByteStringList;
920 
921 	DepInfo *pInfo = pPrjDepInfoList->First();
922 	while ( pInfo )
923 	{
924 		if (pInfo->IsAllModes() || !pInfo->GetModeList() || !pModList)
925 		{
926 			pPrjDepList->PutString( new ByteString((ByteString) *(pInfo->GetProject())));
927 			pPrjInitialDepList->PutString( new ByteString((ByteString) *(pInfo->GetProject())));
928 			//pPrjDepList->PutString( pInfo->GetProject());
929 			//pPrjInitialDepList->PutString( pInfo->GetProject());
930 		}
931 		else
932 		{
933 			sal_Bool bStringFound = sal_False;
934 			SByteStringList * pDepList = pInfo->GetModeList();
935 			ByteString *pModString = pDepList->First();
936 			while ( pModString )
937 			{
938 				ByteString *pDefModString = pModList->First();
939 				while ( pDefModString )
940 				{
941 					if (*pDefModString == *pModString)
942 					{
943 						pPrjDepList->PutString( new ByteString((ByteString) *(pInfo->GetProject())));
944 						pPrjInitialDepList->PutString( new ByteString((ByteString) *(pInfo->GetProject())));
945 						//pPrjDepList->PutString( pInfo->GetProject());
946 						//pPrjInitialDepList->PutString( pInfo->GetProject());
947 						bStringFound = sal_True;
948 						break;
949 					}
950 					pDefModString = pModList->Next();
951 				}
952 				if (bStringFound)
953 					break;
954 				pModString = pDepList->Next();
955 			}
956 
957 		}
958 
959 		pInfo = pPrjDepInfoList->Next();
960 	}
961 }
962 
963 /*****************************************************************************/
InsertDirectory(ByteString aDirName,sal_uInt16 aWhat,sal_uInt16 aWhatOS,ByteString aLogFileName,const ByteString & rClientRestriction)964 sal_Bool Prj::InsertDirectory ( ByteString aDirName, sal_uInt16 aWhat,
965 								sal_uInt16 aWhatOS, ByteString aLogFileName,
966 								const ByteString &rClientRestriction )
967 /*****************************************************************************/
968 {
969 	CommandData* pData = new CommandData();
970 
971 	pData->SetPath( aDirName );
972 	pData->SetCommandType( aWhat );
973 	pData->SetOSType( aWhatOS );
974 	pData->SetLogFile( aLogFileName );
975 	pData->SetClientRestriction( rClientRestriction );
976 
977 	PrjList* pPrjList = GetCommandDataList ();
978 	pPrjList->Insert( pData );
979 
980 	return sal_False;
981 }
982 
983 /*****************************************************************************/
984 //
985 // removes directory and existing dependencies on it
986 //
RemoveDirectory(ByteString aLogFileName)987 CommandData* Prj::RemoveDirectory ( ByteString aLogFileName )
988 /*****************************************************************************/
989 {
990 	PrjList* pPrjList = GetCommandDataList ();
991 	sal_uIntPtr nCount_l = pPrjList->Count();
992 	CommandData* pData;
993 	CommandData* pDataFound = NULL;
994 	SByteStringList* pDataDeps;
995 
996 	for ( sal_uInt16 i = 0; i < nCount_l; i++ )
997 	{
998 		pData = pPrjList->GetObject( i );
999 		if ( pData->GetLogFile() == aLogFileName )
1000 			pDataFound = pData;
1001 		else
1002 		{
1003 			pDataDeps = pData->GetDependencies();
1004 			if ( pDataDeps )
1005 			{
1006 				ByteString* pString;
1007 				sal_uIntPtr nDataDepsCount = pDataDeps->Count();
1008 				for ( sal_uIntPtr j = nDataDepsCount; j > 0; j-- )
1009 				{
1010 					pString = pDataDeps->GetObject( j - 1 );
1011 					if ( pString->GetToken( 0, '.') == aLogFileName )
1012 						pDataDeps->Remove( pString );
1013 				}
1014 			}
1015 		}
1016 	}
1017 
1018 	Remove( pDataFound );
1019 
1020 	return pDataFound;
1021 }
1022 
1023 /*****************************************************************************/
ExtractDependencies()1024 void Prj::ExtractDependencies()
1025 /*****************************************************************************/
1026 {
1027 	sal_uIntPtr nPos = 0;
1028 	CommandData* pData = GetObject(nPos);
1029 	while (pData)
1030 	{
1031 		SByteStringList* pDepList = pData->GetDependencies();
1032 		if (pDepList)
1033 		{
1034 			ByteString * pDepStr = pDepList->First();
1035 			while (pDepStr)
1036 			{
1037 				CommandData* pSearchData = First();
1038 				while (pSearchData)
1039 				{
1040 					if ((*pDepStr == pSearchData->GetPath()) && (pData->GetOSType() & pSearchData->GetOSType()))
1041 					{
1042 						*pDepStr = pSearchData->GetLogFile();
1043 						break;
1044 					}
1045 
1046 					pSearchData = Next();
1047 				}
1048 
1049 				pDepStr = pDepList->Next();
1050 			}
1051 		}
1052 		nPos ++;
1053 		pData = GetObject(nPos);
1054 	}
1055 }
1056 
1057 /*****************************************************************************/
GetCommandDataList()1058 PrjList* Prj::GetCommandDataList ()
1059 /*****************************************************************************/
1060 {
1061 	if (pTempCommandDataList)
1062 		return pTempCommandDataList;
1063 	else
1064 		return (PrjList*)this;
1065 }
1066 
1067 /*****************************************************************************/
RemoveTempCommandDataList()1068 void Prj::RemoveTempCommandDataList()
1069 /*****************************************************************************/
1070 {
1071 	if (pTempCommandDataList)
1072 	{
1073 		delete pTempCommandDataList; // this list remove the elements by itself
1074 		pTempCommandDataList = NULL;
1075 	}
1076 }
1077 
1078 /*****************************************************************************/
GenerateTempCommandDataList()1079 void Prj::GenerateTempCommandDataList()
1080 /*****************************************************************************/
1081 {
1082 	if (pTempCommandDataList)
1083 		RemoveTempCommandDataList();
1084 	pTempCommandDataList = new PrjList();
1085 	CommandData* pCommandData = First();
1086 	while (pCommandData) {
1087 		SvMemoryStream* pStream = new SvMemoryStream();
1088 		*pCommandData >> *pStream;
1089 		CommandData* pNewCommandData = new CommandData();
1090 		pStream->Seek( STREAM_SEEK_TO_BEGIN );
1091 		*pNewCommandData << *pStream;
1092 		pTempCommandDataList->Insert(pNewCommandData, LIST_APPEND);
1093 		delete pStream;
1094 		pCommandData = Next();
1095 	}
1096 }
1097 
1098 /*****************************************************************************/
GenerateEmptyTempCommandDataList()1099 void Prj::GenerateEmptyTempCommandDataList()
1100 /*****************************************************************************/
1101 {
1102 	if (pTempCommandDataList)
1103 		RemoveTempCommandDataList();
1104 	pTempCommandDataList = new PrjList();
1105 }
1106 
1107 /*****************************************************************************/
operator >>(SvStream & rStream)1108 Prj& Prj::operator>>  ( SvStream& rStream )
1109 /*****************************************************************************/
1110 {
1111 	rStream << bVisited;
1112     rStream << aProjectName;
1113     rStream << aProjectPrefix;
1114     rStream << bHardDependencies;
1115     rStream << bFixedDependencies;
1116     rStream << bSorted;
1117     rStream << bIsAvailable;
1118 	rStream << bError;
1119 
1120 	if (pPrjDepInfoList)
1121 	{
1122 		rStream << sal_True;
1123 		*pPrjDepInfoList >> rStream;
1124 	}
1125 	else
1126 		rStream << sal_False;
1127 
1128     sal_uIntPtr nCount_l = Count();
1129     rStream << nCount_l;
1130 
1131     CommandData* pData = First();
1132     while (pData) {
1133         *pData >> rStream;
1134         pData = Next();
1135     }
1136 
1137 	return *this;
1138 }
1139 
1140 /*****************************************************************************/
operator <<(SvStream & rStream)1141 Prj& Prj::operator<<  ( SvStream& rStream )
1142 /*****************************************************************************/
1143 {
1144    	rStream >> bVisited;
1145     rStream >> aProjectName;
1146     rStream >> aProjectPrefix;
1147     rStream >> bHardDependencies;
1148     rStream >> bFixedDependencies;
1149     rStream >> bSorted;
1150     rStream >> bIsAvailable;
1151 	rStream >> bError;
1152 
1153 	sal_Bool bDepList;
1154 	rStream >> bDepList;
1155 	DELETEZ (pPrjDepInfoList);
1156 	if (bDepList)
1157 	{
1158 		pPrjDepInfoList = new SDepInfoList();
1159 		*pPrjDepInfoList << rStream;
1160 	}
1161 
1162     sal_uIntPtr nCount_l;
1163     rStream >> nCount_l;
1164 
1165     for ( sal_uInt16 i = 0; i < nCount_l; i++ ) {
1166         CommandData* pData = new CommandData();
1167         *pData << rStream;
1168         Insert (pData, LIST_APPEND);
1169     }
1170 
1171 	return *this;
1172 }
1173 
1174 
1175 //
1176 //	class Star
1177 //
1178 
1179 /*****************************************************************************/
Star()1180 Star::Star()
1181 /*****************************************************************************/
1182 				: pDepMode (NULL),
1183 				pAllDepMode (NULL)
1184 {
1185 	// this ctor is only used by StarWriter
1186 }
1187 
1188 /*****************************************************************************/
Star(String aFileName,sal_uInt16 nMode)1189 Star::Star(String aFileName, sal_uInt16 nMode )
1190 /*****************************************************************************/
1191 				: nStarMode( nMode ),
1192 				sFileName( aFileName ),
1193 				pDepMode (NULL),
1194 				pAllDepMode (NULL)
1195 {
1196 	Read( aFileName );
1197 }
1198 
1199 /*****************************************************************************/
Star(SolarFileList * pSolarFiles)1200 Star::Star(SolarFileList *pSolarFiles )
1201 /*****************************************************************************/
1202 				: nStarMode( STAR_MODE_MULTIPLE_PARSE ),
1203 				pDepMode (NULL),
1204 				pAllDepMode (NULL)
1205 {
1206 	// this ctor is used by StarBuilder to get the information for the whole workspace
1207 	Read( pSolarFiles );
1208 }
1209 
1210 /*****************************************************************************/
Star(GenericInformationList * pStandLst,ByteString & rVersion)1211 Star::Star(GenericInformationList *pStandLst, ByteString &rVersion )
1212 /*****************************************************************************/
1213 				: pDepMode (NULL),
1214 				pAllDepMode (NULL)
1215 {
1216 	UpdateFileList (pStandLst, rVersion, sal_True );
1217 }
1218 
1219 /*****************************************************************************/
UpdateFileList(GenericInformationList * pStandLst,ByteString & rVersion,sal_Bool bRead)1220 void Star::UpdateFileList( GenericInformationList *pStandLst, ByteString &rVersion,
1221 	sal_Bool bRead )
1222 /*****************************************************************************/
1223 {
1224 	sSourceRoot=String::CreateFromAscii(""); // clear old SourceRoot
1225 	ByteString sPath( rVersion );
1226 
1227 #ifdef UNX
1228 	sPath += "/settings/UNXSOLARLIST";
1229 #else
1230 	sPath += "/settings/SOLARLIST";
1231 #endif
1232 	GenericInformation *pInfo = pStandLst->GetInfo( sPath, sal_True );
1233 
1234 	if( pInfo && pInfo->GetValue().Len()) {
1235 		ByteString sFile( pInfo->GetValue());
1236 		String sFileName_l( sFile, RTL_TEXTENCODING_ASCII_US );
1237 		nStarMode = STAR_MODE_SINGLE_PARSE;
1238 		if (bRead)
1239 			Read( sFileName_l );
1240 	}
1241 	else {
1242 		SolarFileList *pFileList = new SolarFileList();
1243 
1244 		sPath = rVersion;
1245 		sPath += "/drives";
1246 
1247 		GenericInformation *pInfo_l = pStandLst->GetInfo( sPath, sal_True );
1248 		if ( pInfo_l && pInfo_l->GetSubList())  {
1249 			GenericInformationList *pDrives = pInfo_l->GetSubList();
1250 			for ( sal_uIntPtr i = 0; i < pDrives->Count(); i++ ) {
1251 				GenericInformation *pDrive = pDrives->GetObject( i );
1252 				if ( pDrive ) {
1253 					DirEntry aEntry;
1254 					sal_Bool bOk = sal_False;
1255 					if ( sSourceRoot.Len()) {
1256 						aEntry = DirEntry( sSourceRoot );
1257 						bOk = sal_True;
1258 					}
1259 					else {
1260 #ifdef UNX
1261 						sPath = "UnixVolume";
1262 						GenericInformation *pUnixVolume = pDrive->GetSubInfo( sPath );
1263 						if ( pUnixVolume ) {
1264 							String sRoot( pUnixVolume->GetValue(), RTL_TEXTENCODING_ASCII_US );
1265 							aEntry = DirEntry( sRoot );
1266 							bOk = sal_True;
1267 				 		}
1268 #else
1269 						bOk = sal_True;
1270 						String sRoot( *pDrive, RTL_TEXTENCODING_ASCII_US );
1271 						sRoot += String::CreateFromAscii( "\\" );
1272 						aEntry = DirEntry( sRoot );
1273 #endif
1274 					}
1275 					if ( bOk ) {
1276 						sPath = "projects";
1277 						GenericInformation *pProjectsKey = pDrive->GetSubInfo( sPath, sal_True );
1278 						if ( pProjectsKey ) {
1279 							if ( !sSourceRoot.Len()) {
1280 								sPath = rVersion;
1281 								sPath += "/settings/PATH";
1282 								GenericInformation *pPath = pStandLst->GetInfo( sPath, sal_True );
1283 								if( pPath ) {
1284 									ByteString sAddPath( pPath->GetValue());
1285 #ifdef UNX
1286 									sAddPath.SearchAndReplaceAll( "\\", "/" );
1287 #else
1288 									sAddPath.SearchAndReplaceAll( "/", "\\" );
1289 #endif
1290 									String ssAddPath( sAddPath, RTL_TEXTENCODING_ASCII_US );
1291 									aEntry += DirEntry( ssAddPath );
1292 								}
1293 							}
1294 							sPath = rVersion;
1295 							sPath += "/settings/SHORTPATH";
1296 							GenericInformation *pShortPath = pStandLst->GetInfo( sPath, sal_True );
1297 							sal_Bool bShortPath = sal_False;
1298 							if (pShortPath && (pShortPath->GetValue() == "_TRUE"))
1299 								bShortPath = sal_True;
1300 							sSourceRoot = aEntry.GetFull();
1301 							GenericInformationList *pProjects = pProjectsKey->GetSubList();
1302 							if ( pProjects ) {
1303 								GenericInformation * pProject = pProjects->First();
1304 								while (pProject) {
1305 									String sLocalSourceRoot = sSourceRoot;
1306 									ByteString sProject( *pProject );
1307 									String ssProject( sProject, RTL_TEXTENCODING_ASCII_US );
1308 
1309 									ByteString aDirStr ("Directory");
1310 									GenericInformation * pDir = pProject->GetSubInfo (aDirStr);
1311 									if (pDir) {
1312 										ByteString aDir = pDir->GetValue();
1313 										DirEntry aRootEntry;
1314 										if (bShortPath)
1315 											aRootEntry = aEntry + DirEntry(aDir);
1316 										else
1317 											aRootEntry = aEntry.GetPath() + DirEntry(aDir);
1318 										sLocalSourceRoot = aRootEntry.GetFull();
1319 									}
1320 
1321 									String aBuildListPath = CreateFileName(ssProject, sLocalSourceRoot);
1322 
1323 									pFileList->Insert( new String( aBuildListPath ), LIST_APPEND );
1324 									ByteString sFile( aBuildListPath, RTL_TEXTENCODING_ASCII_US );
1325 									pProject = pProjects->Next();
1326 								}
1327 							}
1328 						}
1329 					}
1330 				}
1331 			}
1332 		}
1333 
1334 		if (!CheckFileLoadList(pFileList))
1335 		{
1336 			ClearAvailableDeps();
1337 			ClearCurrentDeps();
1338 			ClearLoadedFilesList();
1339 			RemoveAllPrj();
1340 			bRead = sal_True; // read new list because old list is deleted
1341 		}
1342 
1343 		if (bRead)
1344 			Read( pFileList );
1345 		else
1346 			GenerateFileLoadList( pFileList );
1347 	}
1348 }
1349 
1350 /*****************************************************************************/
FullReload(GenericInformationList * pStandLst,ByteString & rVersion,sal_Bool bRead)1351 void Star::FullReload( GenericInformationList *pStandLst, ByteString &rVersion,
1352 	sal_Bool bRead )
1353 /*****************************************************************************/
1354 {
1355 	ClearAvailableDeps();
1356 	ClearCurrentDeps();
1357 	ClearLoadedFilesList();
1358 	RemoveAllPrj();
1359 	UpdateFileList( pStandLst, rVersion, bRead );
1360 }
1361 
1362 /*****************************************************************************/
CheckFileLoadList(SolarFileList * pSolarFiles)1363 sal_Bool Star::CheckFileLoadList(SolarFileList *pSolarFiles)
1364 /*****************************************************************************/
1365 {
1366 	sal_Bool bRet = sal_True;
1367 	if (aLoadedFilesList.Count() == 0)
1368 		return bRet;
1369 	StarFile * pLoadFile = aLoadedFilesList.First();
1370 	while (pLoadFile)
1371 	{
1372 		sal_Bool bIsAvailable = sal_False;
1373 		String * pFile = pSolarFiles->First();
1374 		while (pFile)
1375 		{
1376 			if (*pFile == pLoadFile->GetName())
1377 			{
1378 				bIsAvailable = sal_True;
1379 				break;
1380 			}
1381 			pFile = pSolarFiles->Next();
1382 		}
1383 		if (!bIsAvailable)
1384 		{
1385 			bRet = sal_False;
1386 			break;
1387 		}
1388 		pLoadFile = aLoadedFilesList.Next();
1389 	}
1390    	return bRet;
1391 }
1392 
1393 /*****************************************************************************/
~Star()1394 Star::~Star()
1395 /*****************************************************************************/
1396 {
1397 	ClearAvailableDeps();
1398 	ClearCurrentDeps();
1399 	ClearLoadedFilesList();
1400 	RemoveAllPrj();
1401 }
1402 
1403 /*****************************************************************************/
GenerateFileLoadList(SolarFileList * pSolarFiles)1404 void Star::GenerateFileLoadList( SolarFileList *pSolarFiles )
1405 /*****************************************************************************/
1406 {
1407 	SolarFileList* pNewSolarFiles = NULL;
1408 	while(  pSolarFiles->Count()) {
1409 		StarFile *pFile = new StarFile( *pSolarFiles->GetObject(( sal_uIntPtr ) 0 ));
1410 		aMutex.acquire();
1411 		sal_uIntPtr nPos = SearchFileEntry(&aLoadedFilesList, pFile);
1412 		if ( nPos == LIST_ENTRY_NOTFOUND )
1413 		{
1414 			if (!pNewSolarFiles)
1415 				pNewSolarFiles = new SolarFileList();
1416 
1417 			pNewSolarFiles->Insert(new String(pFile->GetName()), LIST_APPEND );
1418 		}
1419 		aMutex.release();
1420 		delete pSolarFiles->Remove(( sal_uIntPtr ) 0 );
1421 		delete pFile;
1422 	}
1423 	delete pSolarFiles;
1424 	if (pNewSolarFiles)
1425 		Read (pNewSolarFiles);
1426 }
1427 
1428 /*****************************************************************************/
NeedsFilesForUpdate()1429 SolarFileList* Star::NeedsFilesForUpdate()
1430 /*****************************************************************************/
1431 {
1432 	aMutex.acquire();
1433 	SolarFileList* pPrjList = NULL;
1434 	for ( sal_uIntPtr i = 0; i < aLoadedFilesList.Count(); i++ )
1435 		if ( aLoadedFilesList.GetObject( i )->NeedsUpdate()) {
1436 			if (!pPrjList)
1437 				pPrjList = new SolarFileList();
1438 
1439 			pPrjList->Insert(new String (aLoadedFilesList.GetObject( i )->GetName()), LIST_APPEND);
1440 		}
1441 
1442 	aMutex.release();
1443 	return pPrjList;
1444 }
1445 
1446 /*****************************************************************************/
NeedsUpdate()1447 sal_Bool Star::NeedsUpdate()
1448 /*****************************************************************************/
1449 {
1450 	aMutex.acquire();
1451 	for ( sal_uIntPtr i = 0; i < aLoadedFilesList.Count(); i++ )
1452 		if ( aLoadedFilesList.GetObject( i )->NeedsUpdate()) {
1453 			aMutex.release();
1454 			return sal_True;
1455 		}
1456 
1457 	aMutex.release();
1458 	return sal_False;
1459 }
1460 
1461 /*****************************************************************************/
Read(String & rFileName)1462 void Star::Read( String &rFileName )
1463 /*****************************************************************************/
1464 {
1465 	ClearAvailableDeps ();
1466 	ByteString aString;
1467 	aFileList.Insert( new String( rFileName ));
1468 
1469 	DirEntry aEntry( rFileName );
1470 	aEntry.ToAbs();
1471 	aEntry = aEntry.GetPath().GetPath().GetPath();
1472 	sSourceRoot = aEntry.GetFull();
1473 
1474 	while( aFileList.Count()) {
1475 		String ssFileName = *aFileList.GetObject(( sal_uIntPtr ) 0 );
1476 		StarFile* pFile = ReadBuildlist (ssFileName);
1477 		aMutex.acquire();
1478 		ReplaceFileEntry (&aLoadedFilesList, pFile);
1479 		//aLoadedFilesList.Insert( pFile, LIST_APPEND );
1480 		aMutex.release();
1481 		aFileList.Remove(( sal_uIntPtr ) 0 );
1482 	}
1483 	// resolve all dependencies recursive
1484 	Expand_Impl();
1485 }
1486 
1487 /*****************************************************************************/
SearchFileEntry(StarFileList * pStarFiles,StarFile * pFile)1488 sal_uIntPtr Star::SearchFileEntry( StarFileList *pStarFiles, StarFile* pFile )
1489 /*****************************************************************************/
1490 {
1491 	StarFile *pSearchFile;
1492 	sal_uIntPtr nCount_l;
1493 
1494 	nCount_l = pStarFiles->Count();
1495 
1496 	for ( sal_uIntPtr i=0; i<nCount_l; i++)
1497 	{
1498 		pSearchFile = pStarFiles->GetObject(i);
1499 		if ( pSearchFile->GetName() == pFile->GetName() )
1500 		{
1501 			return i;
1502 		}
1503 	}
1504 	return LIST_ENTRY_NOTFOUND;
1505 }
1506 
1507 /*****************************************************************************/
ReplaceFileEntry(StarFileList * pStarFiles,StarFile * pFile)1508 void Star::ReplaceFileEntry( StarFileList *pStarFiles, StarFile* pFile )
1509 /*****************************************************************************/
1510 {
1511 	sal_uIntPtr nPos = SearchFileEntry(pStarFiles, pFile);
1512 	if ( nPos != LIST_ENTRY_NOTFOUND )
1513 	{
1514 		StarFile* pTmpStarFile = pStarFiles->GetObject(nPos);
1515 		delete pTmpStarFile;
1516 		pStarFiles->Replace(pFile, nPos);
1517 		return;
1518 	}
1519 	pStarFiles->Insert( pFile,	LIST_APPEND );
1520 }
1521 
1522 /*****************************************************************************/
Read(SolarFileList * pSolarFiles)1523 void Star::Read( SolarFileList *pSolarFiles )
1524 /*****************************************************************************/
1525 {
1526 	ClearAvailableDeps ();
1527 	while(  pSolarFiles->Count()) {
1528 		ByteString aString;
1529 
1530 		String ssFileName = *pSolarFiles->GetObject(( sal_uIntPtr ) 0 );
1531 		StarFile *pFile = ReadBuildlist ( ssFileName);
1532 
1533 		if ( pFile->Exists()) {
1534 			DirEntry aEntry( pFile->GetName() );
1535 			DirEntry aEntryPrj = aEntry.GetPath().GetPath();
1536 			if (aEntryPrj.GetExtension() != String::CreateFromAscii( "" ))
1537 			{
1538 				aEntryPrj.CutExtension();
1539 				ByteString aPrjName = ByteString( aEntryPrj.GetName(), gsl_getSystemTextEncoding());
1540 				Prj* pPrj = GetPrj(aPrjName);
1541 				if (pPrj)
1542 					pPrj->IsAvailable (sal_False);
1543 			}
1544 
1545 		}
1546 
1547 		aMutex.acquire();
1548 		ReplaceFileEntry (&aLoadedFilesList, pFile);
1549 		//aLoadedFilesList.Insert( pFile,	LIST_APPEND );
1550 		aMutex.release();
1551 		delete pSolarFiles->Remove(( sal_uIntPtr ) 0 );
1552 	}
1553 	delete pSolarFiles;
1554 
1555 	Expand_Impl();
1556 }
1557 
1558 /*****************************************************************************/
CreateFileName(String & rProject,String & rSourceRoot)1559 String Star::CreateFileName( String& rProject, String& rSourceRoot )
1560 /*****************************************************************************/
1561 {
1562 	// this method is used to find solarlist parts of nabours (other projects)
1563 	String sPrjDir( String::CreateFromAscii( "prj" ));
1564 	String sBuildList( String::CreateFromAscii( "build.lst" ));
1565 //	String sXmlBuildList( String::CreateFromAscii( "build.xlist" ));
1566 
1567 	DirEntry aEntry( rSourceRoot );
1568 	aEntry += DirEntry( rProject );
1569 
1570 	// if this project not exists, maybe it's a not added project of a CWS
1571 
1572 	if ( !aEntry.Exists() ) {
1573 		aEntry.SetExtension(String::CreateFromAscii( "lnk" ));
1574 		if ( !aEntry.Exists() )
1575 			aEntry.CutExtension();
1576 
1577 		aEntry.SetExtension(String::CreateFromAscii( "link" ));
1578 		if ( !aEntry.Exists() )
1579 			aEntry.CutExtension();
1580 	}
1581 
1582 	aEntry += DirEntry( sPrjDir );
1583 
1584 //	DirEntry aPossibleEntry(aEntry);
1585 //  aPossibleEntry += DirEntry( sXmlBuildList );
1586 
1587 	aEntry += DirEntry( sBuildList );
1588 
1589     DirEntry& aActualEntry = aEntry;
1590 /*
1591     if (aPossibleEntry.Exists()) {
1592         aActualEntry = aPossibleEntry;
1593     } else */
1594 	if ( !aActualEntry.Exists() && aDBNotFoundHdl.IsSet())
1595 		aDBNotFoundHdl.Call( &rProject );
1596 	return aActualEntry.GetFull();
1597 }
1598 
1599 /*****************************************************************************/
InsertSolarList(String sProject)1600 void Star::InsertSolarList( String sProject )
1601 /*****************************************************************************/
1602 {
1603 	// inserts a new solarlist part of another project
1604 	String sFileName_l( CreateFileName( sProject, sSourceRoot ));
1605 
1606 	for ( sal_uIntPtr i = 0; i < aFileList.Count(); i++ ) {
1607 		if (( *aFileList.GetObject( i )) == sFileName_l )
1608 			return;
1609 	}
1610 
1611 	ByteString ssProject( sProject, RTL_TEXTENCODING_ASCII_US );
1612 	if ( HasProject( ssProject ))
1613 		return;
1614 
1615 	aFileList.Insert( new String( sFileName_l ), LIST_APPEND );
1616 }
1617 
1618 /*****************************************************************************/
ExpandPrj_Impl(Prj * pPrj,Prj * pDepPrj)1619 void Star::ExpandPrj_Impl( Prj *pPrj, Prj *pDepPrj )
1620 /*****************************************************************************/
1621 {
1622 	if ( pDepPrj->bVisited )
1623 		return;
1624 
1625 	pDepPrj->bVisited = sal_True;
1626 
1627 	SByteStringList* pPrjLst = pPrj->GetDependencies();
1628 	SByteStringList* pDepLst = NULL;
1629 	ByteString* pDepend;
1630 	ByteString* pPutStr;
1631 	Prj *pNextPrj = NULL;
1632 	sal_uIntPtr i, nRetPos;
1633 
1634 	if ( pPrjLst ) {
1635 		pDepLst = pDepPrj->GetDependencies();
1636 		if ( pDepLst ) {
1637 			for ( i = 0; i < pDepLst->Count(); i++ ) {
1638 				pDepend = pDepLst->GetObject( i );
1639 				pPutStr = new ByteString( *pDepend );
1640 				nRetPos = pPrjLst->PutString( pPutStr );
1641 				if( nRetPos == NOT_THERE )
1642 					delete pPutStr;
1643 				pNextPrj = GetPrj( *pDepend );
1644 				if ( pNextPrj ) {
1645 					ExpandPrj_Impl( pPrj, pNextPrj );
1646 				}
1647 			}
1648 		}
1649 	}
1650 }
1651 
1652 /*****************************************************************************/
Expand_Impl()1653 void Star::Expand_Impl()
1654 /*****************************************************************************/
1655 {
1656 	for ( sal_uIntPtr i = 0; i < Count(); i++ ) {
1657 		for ( sal_uIntPtr j = 0; j < Count(); j++ )
1658 			GetObject( j )->bVisited = sal_False;
1659 
1660 		Prj* pPrj = GetObject( i );
1661 		pPrj->SetMode(pDepMode); // DepList f�r Mode initialisieren
1662 		ExpandPrj_Impl( pPrj, pPrj );
1663 	}
1664 }
1665 
1666 /*****************************************************************************/
ReadBuildlist(const String & rFilename,sal_Bool bReadComments,sal_Bool bExtendAlias)1667 StarFile* Star::ReadBuildlist (const String& rFilename, sal_Bool bReadComments, sal_Bool bExtendAlias)
1668 /*****************************************************************************/
1669 {
1670 	ByteString sFileName_l(rFilename, RTL_TEXTENCODING_ASCII_US);
1671 	StarFile *pFile = new StarFile( rFilename );
1672 	if ( pFile->Exists()) {
1673 		SimpleConfig aSolarConfig( rFilename );
1674 		DirEntry aEntry(rFilename);
1675 		ByteString sProjectName (aEntry.GetPath().GetPath().GetName(), RTL_TEXTENCODING_ASCII_US);
1676 		Prj* pPrj = GetPrj (sProjectName); // 0, if Prj not found
1677 		if (pPrj)
1678 		{
1679 			Remove(pPrj); // Project exist, remove old Project and read again
1680 			DELETEZ (pPrj); // delete and set pPrj to 0
1681 		}
1682 		ByteString aString;
1683 		while (( aString = aSolarConfig.GetCleanedNextLine( bReadComments )) != ByteString::EmptyString() )
1684     		InsertTokenLine ( aString, &pPrj, sProjectName, bExtendAlias );
1685 	}
1686 	return pFile;
1687 }
1688 
1689 /*****************************************************************************/
InsertTokenLine(const ByteString & rTokenLine,Prj ** ppPrj,const ByteString & rProjectName,const sal_Bool bExtendAlias)1690 void Star::InsertTokenLine ( const ByteString& rTokenLine, Prj** ppPrj, const ByteString& rProjectName, const sal_Bool bExtendAlias )
1691 /*****************************************************************************/
1692 {
1693 	int i = 0;
1694 	ByteString aWhat, aWhatOS,
1695 		sClientRestriction, aLogFileName, aProjectName, aPrefix, aCommandPara;
1696 	ByteString aDirName;
1697 	sal_Bool bPrjDep = sal_False;
1698 	sal_Bool bHardDep = sal_False;
1699 	sal_Bool bFixedDep = sal_False;
1700 	sal_Bool bNewProject = sal_False;
1701 	int nCommandType=0, nOSType=0;
1702 	Prj* pPrj = *ppPrj;
1703 	CommandData* pCmdData;
1704 	SByteStringList *pDepList = NULL;
1705 	ByteString aCommentString;
1706 	ByteString sToken;
1707 	ByteString sStringBuffer = rTokenLine;
1708 
1709 	while (sStringBuffer != ByteString::EmptyString())
1710 	{
1711 		ByteString sToken = sStringBuffer.GetToken(0,'\t');
1712 		sStringBuffer.Erase(0, sToken.Len()+1);
1713 
1714 		switch (i)
1715 		{
1716 			case 0:
1717 					if ( sToken.Search( "#" ) == 0 )
1718 					{
1719 						i = -1;
1720 						aCommentString = sToken;
1721 						sStringBuffer = ByteString::EmptyString();
1722 						if ( Count() == 0 )
1723 							aDirName = "null_entry" ; //comments at begin of file
1724 					}
1725 					else
1726 					{
1727 						aPrefix = sToken;
1728 						pDepList = 0;
1729 					}
1730 					break;
1731 			case 1:
1732 					aDirName = sToken;
1733 					aProjectName = aDirName.GetToken ( 0, 0x5c);
1734 					if (aProjectName != rProjectName)
1735 						sStringBuffer = ByteString::EmptyString(); // something is wrong, ignore line
1736 					break;
1737 			case 2:
1738 					if ( sToken.CompareTo(":") == COMPARE_EQUAL )
1739 					{
1740 						bPrjDep = sal_True;
1741 						bHardDep = sal_False;
1742 						bFixedDep = sal_False;
1743 						i = 9;
1744 					}
1745 					else if ( sToken.CompareTo("::") == COMPARE_EQUAL )
1746 					{
1747 						bPrjDep = sal_True;
1748 						bHardDep = sal_True;
1749 						bFixedDep = sal_False;
1750 						i = 9;
1751 					}
1752 					else if ( sToken.CompareTo(":::") == COMPARE_EQUAL )
1753 					{
1754 						bPrjDep = sal_True;
1755 						bHardDep = sal_True;
1756 						bFixedDep = sal_True;
1757 						i = 9;
1758 					}
1759 					else
1760 					{
1761 						bPrjDep = sal_False;
1762 						bHardDep = sal_False;
1763 						bFixedDep = sal_False;
1764 
1765 						aWhat = sToken;
1766 						nCommandType = GetJobType(aWhat);
1767 					}
1768 					if (bPrjDep)
1769 					{
1770 						if (pPrj)
1771 							sStringBuffer = ByteString::EmptyString(); // definition more than once or not first line, ignore line
1772 					}
1773 					break;
1774 			case 3:
1775 					if ( !bPrjDep )
1776 					{
1777 						aWhat = sToken;
1778 						if ( aWhat == "-" )
1779 						{
1780 							aCommandPara = ByteString();
1781 						}
1782 						else
1783 							aCommandPara = aWhat;
1784 					}
1785 					break;
1786 			case 4:
1787 					if ( !bPrjDep )
1788 					{
1789 						aWhatOS = sToken;
1790 						if ( aWhatOS.GetTokenCount( ',' ) > 1 ) {
1791 							sClientRestriction = aWhatOS.Copy( aWhatOS.GetToken( 0, ',' ).Len() + 1 );
1792 							aWhatOS = aWhatOS.GetToken( 0, ',' );
1793 						}
1794 						nOSType = GetOSType (aWhatOS);
1795 					}
1796 					break;
1797 			case 5:
1798 					if ( !bPrjDep )
1799 					{
1800 						if (bExtendAlias)
1801 							aLogFileName = (ByteString(aProjectName).Append("_")).Append(sToken);
1802 						else
1803 							aLogFileName = sToken;
1804 
1805 					}
1806 					break;
1807 			default:
1808 					if ( !bPrjDep )
1809 					{
1810 						ByteString aItem = sToken;
1811 						if ( aItem == "NULL" )
1812 						{
1813 							// Liste zu Ende
1814 							i = -1;
1815 						}
1816 						else
1817 						{
1818 							// ggfs. Dependency liste anlegen und ergaenzen
1819 							if ( !pDepList )
1820 								pDepList = new SByteStringList;
1821 							ByteString* pStr;
1822 							if (bExtendAlias)
1823 								pStr = new ByteString ((ByteString (aProjectName).Append("_")).Append(aItem));
1824 							else
1825 								pStr = new ByteString (aItem);
1826 							pDepList->PutString( pStr );
1827 						}
1828 					}
1829 					else
1830 					{
1831 						ByteString aItem = sToken;
1832 						if ( aItem == "NULL" )
1833 						{
1834 							// Liste zu Ende
1835 							i = -1;
1836 							bPrjDep= sal_False;
1837 						}
1838 						else
1839 						{
1840 							ByteString sMode;
1841 							sal_Bool bHasModes = sal_False;
1842 							if (aItem.Search(":") != STRING_NOTFOUND)
1843 							{
1844 								sMode = aItem.GetToken ( 0, ':');
1845 								aItem = aItem.GetToken ( 1, ':');
1846 								bHasModes = sal_True;
1847 							}
1848 							if (!pPrj)
1849 							{
1850 								// neues Project anlegen
1851 								pPrj = new Prj ( aProjectName );
1852 								pPrj->SetPreFix( aPrefix );
1853 								bNewProject = sal_True;
1854 							}
1855 							if (bHasModes)
1856 								pPrj->AddDependencies( aItem, sMode );
1857 							else
1858 								pPrj->AddDependencies( aItem );
1859 							pPrj->HasHardDependencies( bHardDep );
1860 							pPrj->HasFixedDependencies( bFixedDep );
1861 						}
1862 					}
1863 					break;
1864 		}
1865 		if ( i == -1 )
1866 			break;
1867 		i++;
1868 	}
1869 	/* Wenn dieses Project noch nicht vertreten ist, in die Liste
1870 	   der Solar-Projekte einfuegen */
1871 	if ( i == -1 )
1872 	{
1873 		if (!pPrj)
1874 		{
1875 			// neues Project anlegen
1876 			pPrj = new Prj ( aProjectName );
1877 			pPrj->SetPreFix( aPrefix );
1878 			bNewProject = sal_True;
1879 		}
1880 
1881 		if (bNewProject)
1882 			Insert(pPrj,LIST_APPEND);
1883 
1884 		pCmdData = new CommandData;
1885 		pCmdData->SetPath( aDirName );
1886 		pCmdData->SetCommandType( nCommandType );
1887 		pCmdData->SetCommandPara( aCommandPara );
1888 		pCmdData->SetOSType( nOSType );
1889 		pCmdData->SetLogFile( aLogFileName );
1890 		pCmdData->SetComment( aCommentString );
1891 		pCmdData->SetClientRestriction( sClientRestriction );
1892 		if ( pDepList )
1893 			pCmdData->SetDependencies( pDepList );
1894 
1895 		pDepList = 0;
1896 		pPrj->Insert ( pCmdData, LIST_APPEND );
1897 
1898 		// und wer raeumt die depLst wieder ab ?
1899 		// CommandData macht das
1900 	}
1901 	else
1902 	{
1903 		if (!pPrj)
1904 		{
1905 			// new project to set the error flag
1906 			pPrj = new Prj ( rProjectName );
1907 			pPrj->SetPreFix( aPrefix );
1908 			bNewProject = sal_True;
1909 		}
1910 		if (pPrj)
1911 		{
1912 			pPrj->SetError();
1913 			if (bNewProject)
1914 				Insert(pPrj,LIST_APPEND); // add project even if there is a buildlist error
1915 		}
1916 		if ( pDepList )
1917 			delete pDepList;
1918 	}
1919 	*ppPrj = pPrj;
1920 }
1921 
1922 /*****************************************************************************/
HasProject(ByteString aProjectName)1923 sal_Bool Star::HasProject ( ByteString aProjectName )
1924 /*****************************************************************************/
1925 {
1926 	Prj *pPrj;
1927 	int nCount_l;
1928 
1929 	nCount_l = Count();
1930 
1931 	for ( int i=0; i<nCount_l; i++)
1932 	{
1933 		pPrj = GetObject(i);
1934 		if ( pPrj->GetProjectName().ToLowerAscii() == aProjectName.ToLowerAscii() )
1935 			return sal_True;
1936 	}
1937 	return sal_False;
1938 }
1939 
1940 /*****************************************************************************/
GetPrj(ByteString aProjectName)1941 Prj* Star::GetPrj ( ByteString aProjectName )
1942 /*****************************************************************************/
1943 {
1944 	Prj* pPrj;
1945 	int nCount_l = Count();
1946 	for ( int i=0;i<nCount_l;i++)
1947 	{
1948 		pPrj = GetObject(i);
1949 		if ( pPrj->GetProjectName().ToLowerAscii() == aProjectName.ToLowerAscii() )
1950 			return pPrj;
1951 	}
1952 //	return (Prj*)NULL;
1953 	return 0L ;
1954 }
1955 
1956 /*****************************************************************************/
RemovePrj(Prj * pPrj)1957 sal_Bool Star::RemovePrj ( Prj* pPrj )
1958 /*****************************************************************************/
1959 {
1960 	sal_uIntPtr nPos = GetPos(pPrj);
1961 	if (nPos != LIST_ENTRY_NOTFOUND) {
1962 		delete pPrj;
1963 		Remove(nPos);
1964 		return sal_True;
1965 	}
1966 	return sal_False;
1967 }
1968 
1969 /*****************************************************************************/
RemoveAllPrj()1970 void Star::RemoveAllPrj ()
1971 /*****************************************************************************/
1972 {
1973 	Prj* pPrj = First();
1974 	while (pPrj)
1975 	{
1976 		delete pPrj;
1977 		pPrj = Next();
1978 	}
1979 	Clear();
1980 }
1981 
1982 /*****************************************************************************/
GetPrjName(DirEntry & aPath)1983 ByteString Star::GetPrjName( DirEntry &aPath )
1984 /*****************************************************************************/
1985 {
1986 	ByteString aRetPrj, aDirName;
1987 	ByteString aFullPathName = ByteString( aPath.GetFull(), gsl_getSystemTextEncoding());
1988 
1989 	sal_uInt16 nToken = aFullPathName.GetTokenCount(PATH_DELIMETER);
1990 	for ( int i=0; i< nToken; i++ )
1991 	{
1992 		aDirName = aFullPathName.GetToken( i, PATH_DELIMETER );
1993 		if ( HasProject( aDirName ))
1994 		{
1995 			aRetPrj = aDirName;
1996 			break;
1997 		}
1998 	}
1999 
2000 	return aRetPrj;
2001 }
2002 
2003 /*****************************************************************************/
ClearAvailableDeps()2004 void Star::ClearAvailableDeps ()
2005 /*****************************************************************************/
2006 {
2007 	if ( pAllDepMode )
2008 	{
2009 		ByteString *pString = pAllDepMode->First();
2010 		while ( pString )
2011 		{
2012 			delete pString;
2013 			pString = pAllDepMode->Next();
2014 		}
2015 		delete pAllDepMode;
2016 		pAllDepMode = NULL;
2017 	}
2018 }
2019 
2020 /*****************************************************************************/
ClearLoadedFilesList()2021 void Star::ClearLoadedFilesList ()
2022 /*****************************************************************************/
2023 {
2024 	StarFile *pStarFile = aLoadedFilesList.First();
2025 	while ( pStarFile )
2026 	{
2027 		delete pStarFile;
2028 		pStarFile = aLoadedFilesList.Next();
2029 	}
2030 	aLoadedFilesList.Clear();
2031 }
2032 
2033 /*****************************************************************************/
ClearCurrentDeps()2034 void Star::ClearCurrentDeps ()
2035 /*****************************************************************************/
2036 {
2037 	if ( pDepMode )
2038 	{
2039 		ByteString *pString = pDepMode->First();
2040 		while ( pString )
2041 		{
2042 			delete pString;
2043 			pString = pDepMode->Next();
2044 		}
2045 		delete pDepMode;
2046 		pDepMode = NULL;
2047 	}
2048 }
2049 
2050 /*****************************************************************************/
GetAvailableDeps()2051 SByteStringList* Star::GetAvailableDeps ()
2052 /*****************************************************************************/
2053 {
2054 	if ( pAllDepMode )
2055 		return pAllDepMode;
2056 
2057 	Prj *pPrj;
2058 	ByteString* pStr;
2059 	pPrj = First();
2060 	while (pPrj)
2061 	{
2062 		SByteStringList* pModeList = NULL;
2063 		if (pPrj->GetModeAndDependencies() && (pModeList = pPrj->GetModeAndDependencies()->GetAllDepModes()))
2064 		{
2065 			pStr = pModeList->First();
2066 			while (pStr)
2067 			{
2068 				if ( !pAllDepMode )
2069 					pAllDepMode = new SByteStringList();
2070 
2071 				if (pAllDepMode->IsString(pStr) == NOT_THERE)
2072 					pAllDepMode->PutString(new ByteString(*pStr));
2073 
2074 				pStr = pModeList->Next();
2075 			}
2076 		}
2077 		pPrj = Next();
2078 	}
2079 	return pAllDepMode;
2080 }
2081 
2082 /*****************************************************************************/
SetCurrentDeps(SByteStringList * pDepList)2083 void Star::SetCurrentDeps (SByteStringList* pDepList)
2084 /*****************************************************************************/
2085 {
2086 	ClearCurrentDeps();
2087 
2088 	if (pDepList)
2089 	{
2090 		pDepMode = new SByteStringList();
2091 		ByteString *pString = pDepList->First();
2092 		while ( pString )
2093 		{
2094 			ByteString* pStr = new ByteString (*pString);
2095 			if (pDepMode->PutString(pStr) == NOT_THERE)
2096 				delete pStr; // String is not in List
2097 			pString = pDepList->Next();
2098 		}
2099 	}
2100 	Expand_Impl();
2101 }
2102 
2103 ///*****************************************************************************/
2104 //void Star::ReadXmlBuildList(const ByteString& sBuildLstPath) {
2105 ///*****************************************************************************/
2106 //	if (mpXmlBuildList) {
2107 //		Prj* pPrj = NULL;
2108 //
2109 //		try {
2110 //			mpXmlBuildList->loadXMLFile(sBuildLstPath);
2111 //		}
2112 //		catch (XmlBuildListException) {
2113 //			DirEntry aDirEntry (sBuildLstPath);
2114 //			String ssPrjName = aDirEntry.GetPath().GetPath().GetBase();
2115 //			ByteString sPrjName = ByteString(ssPrjName, RTL_TEXTENCODING_ASCII_US);
2116 //			pPrj = GetPrj( sPrjName );
2117 //			if (pPrj)
2118 //			{
2119 //				//remove old Project
2120 //				RemovePrj (pPrj);
2121 //			}
2122 //			return;
2123 //		}
2124 //
2125 //		try {
2126 //			ByteString sProjectName = mpXmlBuildList->getModuleName();
2127 //			pPrj = GetPrj( sProjectName );
2128 //			if (pPrj)
2129 //			{
2130 //				//remove old Project
2131 //				RemovePrj (pPrj);
2132 //			}
2133 //
2134 //			// insert new Project
2135 //			pPrj = new Prj ( sProjectName );
2136 //			pPrj->SetPreFix( sProjectName ); // use ProjectName as Prefix
2137 //			Insert(pPrj,LIST_APPEND);
2138 //
2139 //			// get global dependencies
2140 //			FullByteStringListWrapper aProducts = mpXmlBuildList->getProducts();
2141 //			ByteString aDepType = ByteString(DEP_MD_ALWAYS_STR);
2142 //			if (mpXmlBuildList->hasModuleDepType(aProducts, aDepType))
2143 //				pPrj->HasHardDependencies( sal_True );
2144 //
2145 //			aDepType = ByteString(DEP_MD_FORCE_STR);
2146 //			if (mpXmlBuildList->hasModuleDepType(aProducts, aDepType))
2147 //			{
2148 //				pPrj->HasHardDependencies( sal_True );
2149 //				pPrj->HasFixedDependencies( sal_True );
2150 //			}
2151 //
2152 //			// modul dependencies
2153 //			ByteString sModulDepType = ByteString();
2154 //			FullByteStringListWrapper aModulDeps = mpXmlBuildList->getModuleDependencies(aProducts, sModulDepType);
2155 //			ByteString * pModulDep = aModulDeps.First();
2156 //			while (pModulDep)
2157 //			{
2158 //				FullByteStringListWrapper aModulProducts = mpXmlBuildList->getModuleProducts(*pModulDep);
2159 //				ByteString *pModulePoduct = aModulProducts.First();
2160 //				while (pModulePoduct)
2161 //				{
2162 //					if (*pModulePoduct == XML_ALL)
2163 //						pPrj->AddDependencies( *pModulDep );
2164 //					else
2165 //						pPrj->AddDependencies( *pModulDep, *pModulePoduct);
2166 //
2167 //					pModulePoduct = aModulProducts.Next();
2168 //				}
2169 //				pModulDep = aModulDeps.Next();
2170 //			}
2171 //
2172 //			// job dirs
2173 //			ByteString sJobType = ByteString();
2174 //			ByteString sJobPlatforms = ByteString();
2175 //			FullByteStringListWrapper aJobDirs = mpXmlBuildList->getJobDirectories(sJobType, sJobPlatforms); // all dirs
2176 //			ByteString* pJobDir = aJobDirs.First();
2177 //			while (pJobDir)
2178 //			{
2179 //				FullByteStringListWrapper aJobPlatforms = mpXmlBuildList->getJobPlatforms (*pJobDir);
2180 //				ByteString* pJobPlatform = aJobPlatforms.First();
2181 //				while (pJobPlatform)
2182 //				{
2183 //					ByteString sJobRestriction = ByteString();
2184 //					FullByteStringListWrapper aJobReq = mpXmlBuildList->getJobBuildReqs (*pJobDir, *pJobPlatform);
2185 //					// nur ein Req pro Platform wird zur Zeit unterst�tzt
2186 //					// mehr geht wegen der Struktur zur Zeit nicht!
2187 //					// lese sie trotzdem kommasepariert ein, wenn n�tig
2188 //					if (aJobReq.Count() > 0)
2189 //					{
2190 //						ByteString* pRestriction = aJobReq.First();
2191 //						sJobRestriction = ByteString (*pRestriction);
2192 //						pRestriction = aJobReq.Next();
2193 //						while (pRestriction)
2194 //						{
2195 //							sJobRestriction += ByteString (",");
2196 //							sJobRestriction += ByteString (*pRestriction);
2197 //							pRestriction = aJobReq.Next();
2198 //						}
2199 //					}
2200 //
2201 //					FullByteStringListWrapper aJobTypes = mpXmlBuildList->getJobTypes (*pJobDir);
2202 //					ByteString * pJobType = aJobTypes.First();
2203 //					while(pJobType)
2204 //					{
2205 //						FullByteStringListWrapper aDirDependencies = mpXmlBuildList->getDirDependencies(*pJobDir, *pJobType, *pJobPlatform);
2206 //						SByteStringList *pDepList = NULL;
2207 //						if (aDirDependencies.Count() > 0)
2208 //						{
2209 //							pDepList = new SByteStringList;
2210 //							ByteString* pDirDep = aDirDependencies.First();
2211 //							while (pDirDep)
2212 //							{
2213 //								ByteString sFullDir = sProjectName;
2214 //								sFullDir += *pDirDep;
2215 //								sFullDir.SearchAndReplaceAll('/', '\\');
2216 //								*pDirDep = sFullDir;
2217 //								pDepList->PutString(pDirDep);	// String wird �bergeben
2218 //								aDirDependencies.Remove();		// Zeiger aus alter Liste l�schen
2219 //								pDirDep = aDirDependencies.First();
2220 //							}
2221 //						}
2222 //						// insert CommandData
2223 //						CommandData * pCmdData = new CommandData;
2224 //						ByteString sRequiredPath = sProjectName;
2225 //						sRequiredPath += *pJobDir;
2226 //						sRequiredPath.SearchAndReplaceAll('/', '\\');
2227 //						pCmdData->SetPath(sRequiredPath);
2228 //						pCmdData->SetCommandType( GetJobType(*pJobType) );
2229 //						pCmdData->SetCommandPara( ByteString() );
2230 //						pCmdData->SetOSType( GetOSType(*pJobPlatform) );
2231 //						ByteString sLogFileName = sProjectName;
2232 //						sLogFileName += ByteString::CreateFromInt64( pPrj->Count() );
2233 // 						pCmdData->SetLogFile( sLogFileName );
2234 //						pCmdData->SetClientRestriction( sJobRestriction );
2235 //						if ( pDepList )
2236 //							pCmdData->SetDependencies( pDepList );
2237 //
2238 //						pPrj->Insert ( pCmdData, LIST_APPEND );
2239 //
2240 //						pJobType = aJobTypes.Next();
2241 //					}
2242 //
2243 //					pJobPlatform = aJobPlatforms.Next();
2244 //				}
2245 //
2246 //				pJobDir = aJobDirs.Next();
2247 //			}
2248 //			pPrj->ExtractDependencies();
2249 //		}
2250 //		catch (XmlBuildListException) {
2251 //			if (pPrj)
2252 //			{
2253 //				RemovePrj (pPrj);
2254 //				delete pPrj;
2255 //			}
2256 //
2257 //		}
2258 //	}
2259 //}
2260 
2261 /*****************************************************************************/
GetOSType(ByteString & aWhatOS)2262 int Star::GetOSType ( ByteString& aWhatOS ) {
2263 /*****************************************************************************/
2264     int nOSType = OS_NONE;
2265     if ( aWhatOS == "all" )
2266 	    nOSType = ( OS_WIN16 | OS_WIN32 | OS_OS2 | OS_UNX | OS_MAC );
2267     else if ( aWhatOS == "w" || aWhatOS == "wnt" )
2268 	    nOSType = ( OS_WIN16 | OS_WIN32 );
2269     else if ( aWhatOS == "p" )
2270 	    nOSType = OS_OS2;
2271     else if ( aWhatOS == "u" || aWhatOS == "unx" )
2272 	    nOSType = OS_UNX;
2273     else if ( aWhatOS == "d" )
2274 	    nOSType = OS_WIN16;
2275     else if ( aWhatOS == "n" )
2276 	    nOSType = OS_WIN32;
2277     else if ( aWhatOS == "m" || aWhatOS == "mac" )
2278 	    nOSType = OS_MAC;
2279     return nOSType;
2280 
2281 };
2282 
2283 /*****************************************************************************/
GetJobType(ByteString & JobType)2284 int Star::GetJobType ( ByteString& JobType ) {
2285 /*****************************************************************************/
2286     int nCommandType = 0;
2287     if ( JobType == "nmake" || JobType == "make")
2288         nCommandType = COMMAND_NMAKE;
2289     else if ( JobType == "get" )
2290         nCommandType = COMMAND_GET;
2291     else {
2292         sal_uIntPtr nOffset = JobType.Copy( 3 ).ToInt32();
2293 	    nCommandType = COMMAND_USER_START + nOffset - 1;
2294     }
2295     return nCommandType;
2296 };
2297 
2298 /*****************************************************************************/
PutPrjIntoStream(SByteStringList * pPrjNameList,SvStream * pStream)2299 void Star::PutPrjIntoStream (SByteStringList* pPrjNameList, SvStream* pStream)
2300 /*****************************************************************************/
2301 {
2302     aMutex.acquire();
2303     *pStream << sal_False; // not full Star / only some Projects
2304 
2305     sal_uIntPtr nCount_l = pPrjNameList->Count();
2306     *pStream << nCount_l;
2307     ByteString* pStr = pPrjNameList->First();
2308     while (pStr) {
2309         Prj* pPrj = GetPrj (*pStr);
2310         *pPrj >> *pStream;
2311         pStr = pPrjNameList->Next();
2312     }
2313     aMutex.release();
2314 }
2315 
2316 /*****************************************************************************/
operator >>(SvStream & rStream)2317 Star& Star::operator>>  ( SvStream& rStream )
2318 /*****************************************************************************/
2319 {
2320     aMutex.acquire();
2321     rStream << sal_True; // full Star
2322     rStream << nStarMode;
2323 	if (pDepMode)
2324 	{
2325 		rStream << sal_True;
2326 		*pDepMode >> rStream;
2327 	}
2328 	else
2329 		rStream << sal_False;
2330 
2331     sal_uIntPtr nCount_l = Count();
2332     rStream << nCount_l;
2333     Prj* pPrj = First();
2334     while (pPrj) {
2335         *pPrj >> rStream;
2336         pPrj = Next();
2337     }
2338     aMutex.release();
2339 
2340 	return *this;
2341 }
2342 
2343 /*****************************************************************************/
operator <<(SvStream & rStream)2344 Star& Star::operator<<  ( SvStream& rStream )
2345 /*****************************************************************************/
2346 {
2347     aMutex.acquire();
2348     sal_Bool bFullList;
2349     rStream >> bFullList;
2350     if (bFullList)
2351     {
2352         rStream >> nStarMode;
2353 	    sal_Bool bDepMode;
2354 	    rStream >> bDepMode;
2355 	    if (pDepMode)
2356 		    pDepMode->CleanUp();
2357 	    if (bDepMode)
2358 	    {
2359 		    if (!pDepMode)
2360 			    pDepMode = new SByteStringList();
2361 		    *pDepMode << rStream;
2362 	    }
2363 	    else
2364 		    DELETEZ (pDepMode);
2365 
2366     }
2367     sal_uIntPtr nCount_l;
2368     rStream >> nCount_l;
2369     for ( sal_uInt16 i = 0; i < nCount_l; i++ ) {
2370         Prj* pPrj = new Prj();
2371         *pPrj << rStream;
2372 		pPrj->SetMode(pDepMode);
2373         if (HasProject (pPrj->GetProjectName())) {
2374             Prj* pTmpPrj = GetPrj( pPrj->GetProjectName() );
2375             Replace (pPrj, pTmpPrj);
2376             delete pTmpPrj;
2377         }
2378         else
2379             Insert (pPrj, LIST_APPEND);
2380     }
2381 	Expand_Impl();
2382     aMutex.release();
2383 	return *this;
2384 }
2385 
2386 
2387 
2388 //
2389 //	class StarWriter
2390 //
2391 
2392 /*****************************************************************************/
StarWriter(String aFileName,sal_Bool bReadComments,sal_uInt16 nMode)2393 StarWriter::StarWriter( String aFileName, sal_Bool bReadComments, sal_uInt16 nMode )
2394 /*****************************************************************************/
2395 				: Star ()
2396 {
2397 	sFileName = aFileName;
2398 	Read ( aFileName, bReadComments, nMode );
2399 }
2400 
2401 /*****************************************************************************/
StarWriter(SolarFileList * pSolarFiles,sal_Bool bReadComments)2402 StarWriter::StarWriter( SolarFileList *pSolarFiles, sal_Bool bReadComments )
2403 /*****************************************************************************/
2404 				: Star ()
2405 {
2406 	Read( pSolarFiles, bReadComments );
2407 }
2408 
2409 /*****************************************************************************/
StarWriter(GenericInformationList * pStandLst,ByteString & rVersion,ByteString & rMinor,sal_Bool bReadComments)2410 StarWriter::StarWriter( GenericInformationList *pStandLst, ByteString &rVersion,
2411 	ByteString &rMinor, sal_Bool bReadComments )
2412 /*****************************************************************************/
2413 				: Star ()
2414 {
2415 	ByteString sPath( rVersion );
2416 
2417 #ifdef UNX
2418 	sPath += "/settings/UNXSOLARLIST";
2419 #else
2420 	sPath += "/settings/SOLARLIST";
2421 #endif
2422 	GenericInformation *pInfo_l = pStandLst->GetInfo( sPath, sal_True );
2423 
2424 	if( pInfo_l && pInfo_l->GetValue().Len()) {
2425 		ByteString sFile( pInfo_l->GetValue());
2426 		String sFileName_l( sFile, RTL_TEXTENCODING_ASCII_US );
2427 		nStarMode = STAR_MODE_SINGLE_PARSE;
2428 		Read( sFileName_l, bReadComments );
2429 	}
2430 	else {
2431 		SolarFileList *pFileList = new SolarFileList();
2432 
2433 		sPath = rVersion;
2434 		sPath += "/drives";
2435 
2436 		GenericInformation *pInfo_k = pStandLst->GetInfo( sPath, sal_True );
2437 		if ( pInfo_k && pInfo_k->GetSubList())  {
2438 			GenericInformationList *pDrives = pInfo_k->GetSubList();
2439 			for ( sal_uIntPtr i = 0; i < pDrives->Count(); i++ ) {
2440 				GenericInformation *pDrive = pDrives->GetObject( i );
2441 				if ( pDrive ) {
2442 					DirEntry aEntry;
2443 					sal_Bool bOk = sal_False;
2444 					if ( sSourceRoot.Len()) {
2445 						aEntry = DirEntry( sSourceRoot );
2446 						bOk = sal_True;
2447 					}
2448 					else {
2449 #ifdef UNX
2450 						sPath = "UnixVolume";
2451 						GenericInformation *pUnixVolume = pDrive->GetSubInfo( sPath );
2452 						if ( pUnixVolume ) {
2453 							String sRoot( pUnixVolume->GetValue(), RTL_TEXTENCODING_ASCII_US );
2454 							aEntry = DirEntry( sRoot );
2455 							bOk = sal_True;
2456 				 		}
2457 #else
2458 						bOk = sal_True;
2459 						String sRoot( *pDrive, RTL_TEXTENCODING_ASCII_US );
2460 						sRoot += String::CreateFromAscii( "\\" );
2461 						aEntry = DirEntry( sRoot );
2462 #endif
2463 					}
2464 					if ( bOk ) {
2465 						sPath = "projects";
2466 						GenericInformation *pProjectsKey = pDrive->GetSubInfo( sPath, sal_True );
2467 						if ( pProjectsKey ) {
2468 							if ( !sSourceRoot.Len()) {
2469 								sPath = rVersion;
2470 								sPath += "/settings/PATH";
2471 								GenericInformation *pPath = pStandLst->GetInfo( sPath, sal_True );
2472 								if( pPath ) {
2473 									ByteString sAddPath( pPath->GetValue());
2474 #ifdef UNX
2475 									sAddPath.SearchAndReplaceAll( "\\", "/" );
2476 #else
2477 									sAddPath.SearchAndReplaceAll( "/", "\\" );
2478 #endif
2479                                      //If Minor has been set add it to path
2480                                     if (rMinor.Len()>0) {
2481                                         sAddPath += ".";
2482                                         sAddPath += rMinor;
2483                                     }
2484 									String ssAddPath( sAddPath, RTL_TEXTENCODING_ASCII_US );
2485 
2486 									aEntry += DirEntry( ssAddPath );
2487 								}
2488 							}
2489 							sPath = rVersion;
2490 							sPath += "/settings/SHORTPATH";
2491 							GenericInformation *pShortPath = pStandLst->GetInfo( sPath, sal_True );
2492 							sal_Bool bShortPath = sal_False;
2493 							if (pShortPath && (pShortPath->GetValue() == "_TRUE"))
2494 								bShortPath = sal_True;
2495 							sSourceRoot = aEntry.GetFull();
2496 							GenericInformationList *pProjects = pProjectsKey->GetSubList();
2497 							if ( pProjects ) {
2498 								String sPrjDir( String::CreateFromAscii( "prj" ));
2499 								String sSolarFile( String::CreateFromAscii( "build.lst" ));
2500 
2501 								GenericInformation * pProject = pProjects->First();
2502 								while (pProject) {
2503 									ByteString sProject( *pProject);
2504 									String ssProject( sProject, RTL_TEXTENCODING_ASCII_US );
2505 
2506 									DirEntry aPrjEntry( aEntry );
2507 
2508 									ByteString aDirStr ("Directory");
2509 									GenericInformation * pDir = pProject->GetSubInfo (aDirStr);
2510 									if (pDir) {
2511 										ByteString aDir = pDir->GetValue();
2512 										if (bShortPath)
2513 											aPrjEntry = aEntry;
2514 										else
2515 											aPrjEntry = aEntry.GetPath();
2516 										aPrjEntry += DirEntry(aDir);
2517 									}
2518 
2519 									aPrjEntry += DirEntry( ssProject );
2520 									aPrjEntry += DirEntry( sPrjDir );
2521 									aPrjEntry += DirEntry( sSolarFile );
2522 
2523 									pFileList->Insert( new String( aPrjEntry.GetFull()), LIST_APPEND );
2524 
2525 									ByteString sFile( aPrjEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
2526 									fprintf( stdout, "%s\n", sFile.GetBuffer());
2527 									pProject = pProjects->Next();
2528 								}
2529 							}
2530 						}
2531 					}
2532 				}
2533 			}
2534 		}
2535 		Read( pFileList, bReadComments );
2536 	}
2537 }
2538 
2539 /*****************************************************************************/
CleanUp()2540 void StarWriter::CleanUp()
2541 /*****************************************************************************/
2542 {
2543 	Expand_Impl();
2544 }
2545 
2546 /*****************************************************************************/
Read(String aFileName,sal_Bool bReadComments,sal_uInt16 nMode)2547 sal_uInt16 StarWriter::Read( String aFileName, sal_Bool bReadComments, sal_uInt16 nMode  )
2548 /*****************************************************************************/
2549 {
2550 	sFileName = aFileName;
2551 
2552 	nStarMode = nMode;
2553 
2554 	ByteString aString;
2555 	aFileList.Insert( new String( aFileName ));
2556 
2557 	DirEntry aEntry( aFileName );
2558 	aEntry.ToAbs();
2559 	aEntry = aEntry.GetPath().GetPath().GetPath();
2560 	sSourceRoot = aEntry.GetFull();
2561 
2562 	while( aFileList.Count()) {
2563 		String ssFileName = *aFileList.GetObject(( sal_uIntPtr ) 0 );
2564 		StarFile* pFile = ReadBuildlist (ssFileName, bReadComments, sal_False);
2565 		aMutex.acquire();
2566 		aLoadedFilesList.Insert( pFile, LIST_APPEND );
2567 		aMutex.release();
2568 		delete aFileList.Remove(( sal_uIntPtr ) 0 );
2569 	}
2570 	// resolve all dependencies recursive
2571 	Expand_Impl();
2572 
2573 	// Die gefundenen Abhaengigkeiten rekursiv aufloesen
2574 	Expand_Impl();
2575 	return 0;
2576 }
2577 
2578 /*****************************************************************************/
Read(SolarFileList * pSolarFiles,sal_Bool bReadComments)2579 sal_uInt16 StarWriter::Read( SolarFileList *pSolarFiles, sal_Bool bReadComments )
2580 /*****************************************************************************/
2581 {
2582 	nStarMode = STAR_MODE_MULTIPLE_PARSE;
2583 
2584 	// this ctor is used by StarBuilder to get the information for the whole workspace
2585 	while(  pSolarFiles->Count()) {
2586 		ByteString aString;
2587 		String ssFileName = *pSolarFiles->GetObject(( sal_uIntPtr ) 0 );
2588 		StarFile* pFile = ReadBuildlist(ssFileName, bReadComments, sal_False);
2589 		aMutex.acquire();
2590 		aLoadedFilesList.Insert( pFile,	LIST_APPEND );
2591 		aMutex.release();
2592 		delete pSolarFiles->Remove(( sal_uIntPtr ) 0 );
2593 	}
2594 	delete pSolarFiles;
2595 
2596 	Expand_Impl();
2597 	return 0;
2598 }
2599 
2600 /*****************************************************************************/
WritePrj(Prj * pPrj,SvFileStream & rStream)2601 sal_uInt16 StarWriter::WritePrj( Prj *pPrj, SvFileStream& rStream )
2602 /*****************************************************************************/
2603 {
2604 	ByteString aDataString;
2605 	ByteString aTab('\t');
2606 	ByteString aSpace(' ');
2607 	ByteString aEmptyString("");
2608 	SByteStringList* pCmdDepList;
2609 	SByteStringList* pPrjDepList;
2610 
2611 	CommandData* pCmdData = NULL;
2612 	if ( pPrj->Count() > 0 )
2613 	{
2614 		pCmdData = pPrj->First();
2615 		if ( (pPrjDepList = pPrj->GetDependencies( sal_False )) )
2616 		{
2617 			aDataString = pPrj->GetPreFix();
2618 			aDataString += aTab;
2619 			aDataString += pPrj->GetProjectName();
2620 			aDataString += aTab;
2621 			if ( pPrj->HasFixedDependencies())
2622 				aDataString+= ByteString(":::");
2623 			else if ( pPrj->HasHardDependencies())
2624 				aDataString+= ByteString("::");
2625 			else
2626 				aDataString+= ByteString(":");
2627 			aDataString += aTab;
2628 			for ( sal_uInt16 i = 0; i< pPrjDepList->Count(); i++ ) {
2629 				aDataString += *pPrjDepList->GetObject( i );
2630 				aDataString += aSpace;
2631 			}
2632 			aDataString+= "NULL";
2633 
2634 			rStream.WriteLine( aDataString );
2635 
2636 			pCmdData = pPrj->Next();
2637 		}
2638 		if ( pCmdData ) {
2639 			do
2640 			{
2641 				if (( aDataString = pCmdData->GetComment()) == aEmptyString )
2642 				{
2643 					aDataString = pPrj->GetPreFix();
2644 					aDataString += aTab;
2645 
2646 					aDataString+= pCmdData->GetPath();
2647 					aDataString += aTab;
2648 					sal_uInt16 nPathLen = pCmdData->GetPath().Len();
2649 					if ( nPathLen < 40 )
2650 						for ( int i = 0; i < 9 - pCmdData->GetPath().Len() / 4 ; i++ )
2651 							aDataString += aTab;
2652 					else
2653 						for ( int i = 0; i < 12 - pCmdData->GetPath().Len() / 4 ; i++ )
2654 							aDataString += aTab;
2655 					aDataString += pCmdData->GetCommandTypeString();
2656 					aDataString += aTab;
2657 					if ( pCmdData->GetCommandType() == COMMAND_GET )
2658 						aDataString += aTab;
2659 					if ( pCmdData->GetCommandPara() == aEmptyString )
2660 						aDataString+= ByteString("-");
2661 					else
2662 						aDataString+= pCmdData->GetCommandPara();
2663 					aDataString += aTab;
2664 					aDataString+= pCmdData->GetOSTypeString();
2665 					if ( pCmdData->GetClientRestriction().Len()) {
2666 						aDataString += ByteString( "," );
2667 						aDataString += pCmdData->GetClientRestriction();
2668 					}
2669 					aDataString += aTab;
2670 					aDataString += pCmdData->GetLogFile();
2671 					aDataString += aSpace;
2672 
2673 					pCmdDepList = pCmdData->GetDependencies();
2674 					if ( pCmdDepList )
2675 						for ( sal_uInt16 i = 0; i< pCmdDepList->Count(); i++ ) {
2676 							aDataString += *pCmdDepList->GetObject( i );
2677 							aDataString += aSpace;
2678 					}
2679 					aDataString += "NULL";
2680 				}
2681 
2682 				rStream.WriteLine( aDataString );
2683 
2684 				pCmdData = pPrj->Next();
2685 			} while ( pCmdData );
2686 		}
2687 	}
2688 	return 0;
2689 }
2690 
2691 /*****************************************************************************/
Write(String aFileName)2692 sal_uInt16 StarWriter::Write( String aFileName )
2693 /*****************************************************************************/
2694 {
2695 	sFileName = aFileName;
2696 
2697 	FileStat::SetReadOnlyFlag( DirEntry( aFileName ), sal_False );
2698 
2699 	SvFileStream aFileStream;
2700 
2701 	aFileStream.Open( aFileName, STREAM_WRITE | STREAM_TRUNC);
2702 	if ( !aFileStream.IsOpen() && aFileIOErrorHdl.IsSet()) {
2703 		String sError( String::CreateFromAscii( "Error: Unable to open \"" ));
2704 		sError += aFileName;
2705 		sError += String::CreateFromAscii( "for writing!" );
2706 		aFileIOErrorHdl.Call( &sError );
2707 	}
2708 
2709 	if ( Count() > 0 )
2710 	{
2711 		Prj* pPrj = First();
2712 		do
2713 		{
2714 			WritePrj( pPrj, aFileStream );
2715 			pPrj = Next();
2716 		} while ( pPrj );
2717 	}
2718 
2719 	aFileStream.Close();
2720 
2721 	return 0;
2722 }
2723 
2724 /*****************************************************************************/
WriteMultiple(String rSourceRoot)2725 sal_uInt16 StarWriter::WriteMultiple( String rSourceRoot )
2726 /*****************************************************************************/
2727 {
2728 	sSourceRoot = rSourceRoot;
2729 
2730 	if ( Count() > 0 )
2731 	{
2732 		String sPrjDir( String::CreateFromAscii( "prj" ));
2733 		String sSolarFile( String::CreateFromAscii( "build.lst" ));
2734 
2735 		Prj* pPrj = First();
2736 		do
2737 		{
2738 			String sName( pPrj->GetProjectName(), RTL_TEXTENCODING_ASCII_US );
2739 
2740 			DirEntry aEntry( rSourceRoot );
2741 			aEntry += DirEntry( sName );
2742 			aEntry += DirEntry( sPrjDir );
2743 			aEntry += DirEntry( sSolarFile );
2744 
2745 			FileStat::SetReadOnlyFlag( aEntry, sal_False );
2746 
2747 			SvFileStream aFileStream;
2748 			aFileStream.Open( aEntry.GetFull(), STREAM_WRITE | STREAM_TRUNC);
2749 
2750 			if ( !aFileStream.IsOpen() && aFileIOErrorHdl.IsSet()) {
2751 				String sError( String::CreateFromAscii( "Error: Unable to open \"" ));
2752 				sError += aEntry.GetFull();
2753 				sError += String::CreateFromAscii( "for writing!" );
2754 				aFileIOErrorHdl.Call( &sError );
2755 			}
2756 
2757 	  		WritePrj( pPrj, aFileStream );
2758 
2759 			aFileStream.Close();
2760 
2761 			pPrj = Next();
2762 		} while ( pPrj );
2763 	}
2764 
2765 	return 0;
2766 }
2767 
2768 /*****************************************************************************/
InsertTokenLine(const ByteString & rTokenLine)2769 void StarWriter::InsertTokenLine ( const ByteString& rTokenLine )
2770 /*****************************************************************************/
2771 {
2772 	ByteString sProjectName = rTokenLine.GetToken(1,'\t');
2773 	Prj* pPrj = GetPrj (sProjectName); // 0, if Prj not found;
2774 	Star::InsertTokenLine ( rTokenLine, &pPrj, sProjectName, sal_False );
2775 }
2776 
2777 /*****************************************************************************/
InsertProject(Prj *)2778 sal_Bool StarWriter::InsertProject ( Prj* /*pNewPrj*/ )
2779 /*****************************************************************************/
2780 {
2781 	return sal_False;
2782 }
2783 
2784 /*****************************************************************************/
RemoveProject(ByteString aProjectName)2785 Prj* StarWriter::RemoveProject ( ByteString aProjectName )
2786 /*****************************************************************************/
2787 {
2788 	sal_uIntPtr nCount_l = Count();
2789 	Prj* pPrj;
2790 	Prj* pPrjFound = NULL;
2791 	SByteStringList* pPrjDeps;
2792 
2793 	for ( sal_uInt16 i = 0; i < nCount_l; i++ )
2794 	{
2795 		pPrj = GetObject( i );
2796 		if ( pPrj->GetProjectName() == aProjectName )
2797 			pPrjFound = pPrj;
2798 		else
2799 		{
2800 			pPrjDeps = pPrj->GetDependencies( sal_False );
2801 			if ( pPrjDeps )
2802 			{
2803 				ByteString* pString;
2804 				sal_uIntPtr nPrjDepsCount = pPrjDeps->Count();
2805 				for ( sal_uIntPtr j = nPrjDepsCount; j > 0; j-- )
2806 				{
2807 					pString = pPrjDeps->GetObject( j - 1 );
2808 					if ( pString->GetToken( 0, '.') == aProjectName )
2809 						pPrjDeps->Remove( pString );
2810 				}
2811 			}
2812 		}
2813 	}
2814 
2815 	Remove( pPrjFound );
2816 
2817 	return pPrjFound;
2818 }
2819 
2820 //
2821 // class StarFile
2822 //
2823 
2824 /*****************************************************************************/
StarFile(const String & rFile)2825 StarFile::StarFile( const String &rFile )
2826 /*****************************************************************************/
2827 				: aFileName( rFile )
2828 {
2829 	DirEntry aEntry( aFileName );
2830 	if ( aEntry.Exists()) {
2831 		bExists = sal_True;
2832 		FileStat aStat( aEntry );
2833 		aDate = aStat.DateModified();
2834 		aTime = aStat.TimeModified();
2835 		aDateCreated = aStat.DateCreated();
2836 		aTimeCreated = aStat.TimeCreated();
2837 	}
2838 	else
2839 		bExists = sal_False;
2840 }
2841 
2842 /*****************************************************************************/
NeedsUpdate()2843 sal_Bool StarFile::NeedsUpdate()
2844 /*****************************************************************************/
2845 {
2846 	DirEntry aEntry( aFileName );
2847 	if ( aEntry.Exists()) {
2848 		if ( !bExists ) {
2849 			bExists = sal_True;
2850 			return sal_True;
2851 		}
2852 		FileStat aStat( aEntry );
2853 		if (( aStat.DateModified() != aDate ) || ( aStat.TimeModified() != aTime )
2854 			|| ( aStat.DateCreated() != aDateCreated ) || ( aStat.TimeCreated() != aTimeCreated ))
2855 			return sal_True;
2856 	}
2857 	return sal_False;
2858 }
2859