xref: /aoo41x/main/xml2cmp/source/xcd/cr_index.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 
29 #include "cr_index.hxx"
30 
31 #include <string.h>
32 #include <fstream>
33 #include "../support/syshelp.hxx"
34 #include "xmltree.hxx"
35 #include "parse.hxx"
36 #include "cr_html.hxx"
37 
38 
39 extern unsigned	C_nSupportedServicesIndex;
40 
41 char C_sLineEnd[] = "\n";
42 
43 char C_sFileBegin[] 	= "<HTML><HEAD></HEAD><BODY bgcolor=\"#ffffff\">\n";
44 char C_sFileEnd[]   	= "</BODY></HTML>\n";
45 char C_sTableBegin[] 	= "<TABLE WIDTH=100% BORDER=1 CELLPADDING=4 CELLSPACING=0><TBODY>\n";
46 char C_sTableEnd[]  	= "</TBODY></TABLE>\n";
47 char C_sService[]	    = "SupportedService";
48 char C_sModule[]	    = "ModuleName";
49 char C_sComponentname[]	= "ComponentName";
50 
51 
52 
53 Simstr sIdlRootPath;
54 
55 
56 Index::Index( const char *			i_sOutputDirectory,
57 			  const char *			i_sIdlRootPath,
58 			  const List<Simstr> &	 )
59 	:	aService2Module(20),
60 		aModule2Service(20),
61 		sOutputDirectory(i_sOutputDirectory),
62 		sIdlRootPath(i_sIdlRootPath)
63 		// sCurModule
64 {
65 	::sIdlRootPath = i_sIdlRootPath;
66 }
67 
68 Index::~Index()
69 {
70 }
71 
72 void
73 Index::GatherData(  const List<Simstr> & i_rInputFileList )
74 {
75 	for ( unsigned i = 0; i < i_rInputFileList.size(); ++i )
76 	{
77 		ReadFile( i_rInputFileList[i].str() );
78 	}
79 }
80 
81 void
82 Index::WriteOutput( const char * i_sOuputFile )
83 {
84 	std::ofstream aOut( i_sOuputFile, std::ios::out );
85 	if (! aOut)
86 	{
87 		std::cerr << "Error: Indexfile \""
88 			 << i_sOuputFile
89 			 << "\" could not be created."
90 			 << std::endl;
91 		return;
92 	}
93 
94 	WriteStr(aOut, C_sFileBegin);
95 
96 	WriteStr(aOut, "<H2>Module Descriptions Index</H2>");
97 	WriteStr(aOut, C_sLineEnd );
98 
99 
100 	WriteTableFromHeap( aOut, aService2Module, C_sService, C_sModule, lt_html );
101 	WriteTableFromHeap( aOut, aModule2Service, C_sModule, C_sService, lt_idl );
102 
103 	WriteStr( aOut, C_sFileEnd );
104 	aOut.close();
105 }
106 
107 void
108 Index::InsertSupportedService( const Simstr &		i_sService )
109 {
110 	aService2Module.InsertValue( i_sService, sCurModule );
111 	aModule2Service.InsertValue( sCurModule, i_sService );
112 }
113 
114 void
115 Index::ReadFile(  const char * i_sFilename )
116 {
117 	static char				sOutputHtml[1020];
118 
119 	ModuleDescription	aModule;
120 	X2CParser			aParser(aModule);
121 
122 	// Parse
123 	bool bResult = aParser.Parse(i_sFilename);
124 	if (! bResult)
125 	{
126 		std::cerr << "Error: File \""
127 			 << i_sFilename
128 			 << "\" could not be parsed."
129 			 << std::endl;
130 		return;
131 	}
132 
133 	// Create Html:
134 	CreateHtmlFileName( sOutputHtml, aModule );
135 	HtmlCreator 	aHtmlCreator( sOutputHtml, aModule, sIdlRootPath );
136 	aHtmlCreator.Run();
137 
138 	// GetResults:
139 	sCurModule = aModule.ModuleName();
140 
141 	List< const MultipleTextElement* > aSupportedServices;
142 	aModule.Get_SupportedServices(aSupportedServices);
143 
144 	for ( unsigned s = 0; s < aSupportedServices.size(); ++s )
145 	{
146 		aSupportedServices[s]->Insert2Index(*this);
147 	}
148 }
149 
150 void
151 Index::CreateHtmlFileName(	char *						o_sOutputHtml,
152 							const ModuleDescription	&   i_rModule )
153 {
154     if ( strlen(sOutputDirectory.str()) + strlen(i_rModule.ModuleName()) > 1000 )
155     {
156      	strcpy( o_sOutputHtml, "too-long-filename.html");   // STRCPY SAFE HERE
157         return;
158     }
159 
160 	strcpy( o_sOutputHtml, sOutputDirectory.str() );        // STRCPY SAFE HERE
161 #if defined(WNT) || defined(OS2)
162 	strcat(o_sOutputHtml, "\\");                            // STRCAT SAFE HERE
163 #elif defined(UNX)
164 	strcat(o_sOutputHtml, "/");                             // STRCAT SAFE HERE
165 #else
166 #error	WNT or UNX have to be defined.
167 #endif
168 	strcat( o_sOutputHtml, i_rModule.ModuleName() );        // STRCAT SAFE HERE
169 	strcat( o_sOutputHtml, ".html" );                       // STRCAT SAFE HERE
170 }
171 
172 
173 void
174 Index::WriteTableFromHeap( std::ostream &  	o_rOut,
175 						   Heap & 	    i_rHeap,
176 						   const char *	i_sIndexValue,
177 						   const char *	i_sIndexReference,
178 						   E_LinkType		i_eLinkType )
179 {
180 	WriteStr(o_rOut, "<H3><BR>");
181 	WriteStr(o_rOut, i_sIndexValue );
182 	WriteStr(o_rOut, " -> ");
183 	WriteStr(o_rOut, i_sIndexReference );
184 	WriteStr(o_rOut, "</H3>\n");
185 
186 	WriteStr(o_rOut, C_sTableBegin);
187 	WriteHeap( o_rOut, i_rHeap, i_eLinkType );
188 	WriteStr(o_rOut, C_sTableEnd);
189 }
190 
191 
192 void
193 Index::WriteHeap( std::ostream &  	o_rOut,
194 				  Heap &	    i_rHeap,
195 		          E_LinkType 	i_eLinkType )
196 {
197 	static Simstr S_sKey;
198 	static char C_sSpaceInName[] = "&nbsp;&nbsp;&nbsp;";
199 	S_sKey = "";
200 
201 
202 	WriteStr( o_rOut, "<TR><TD width=33% valign=\"top\">" );
203 
204 	for ( HeapItem * pHeapTop = i_rHeap.ReleaseTop();
205 		  pHeapTop != 0;
206 		  pHeapTop = i_rHeap.ReleaseTop() )
207 	{
208 		if ( S_sKey != pHeapTop->Key() )
209 		{
210 			const char * pStart = pHeapTop->Key().str();
211 			const char * pBreak = strstr( pStart, " in ");
212 
213 			if (S_sKey.l()>0)
214 			{
215 				WriteStr( o_rOut, "</TD></TR>\n" );
216 				WriteStr( o_rOut, "<TR><TD width=33% valign=\"top\">" );
217 			}
218 
219 			if ( pBreak == 0 )
220 				WriteStr( o_rOut, pStart );
221 			else
222 			{
223 				o_rOut.write( pStart, pBreak - pStart );
224 				WriteStr( o_rOut, C_sSpaceInName );
225 				WriteStr( o_rOut, pBreak );
226 			}
227 			WriteStr( o_rOut, "</TD><TD width=66%>" );
228 			S_sKey = pHeapTop->Key();
229 		}
230 		else
231 		{
232 			WriteStr( o_rOut, "<BR>" );
233 		}
234 		WriteName( o_rOut, sIdlRootPath, pHeapTop->Value(), i_eLinkType );
235 		delete pHeapTop;
236 	}
237 
238 	WriteStr( o_rOut, "</TD></TR>\n" );
239 }
240 
241 
242 
243 /**	�bersicht der Struktur
244 
245 MODULEDESCRIPTION
246 {
247 	ModuleName,
248 	COMPONENTDESCRIPTION
249 	{
250 		Author,
251 		Name,
252 		Description,
253 		LoaderName,
254 		Language,
255 		Status,
256 		SupportedService+,
257 		ReferenceDocu*
258 		ServiceDependency*
259 		Type*
260 	}
261 	ProjectBuildDependency*
262 	RuntimeModuleDependency*
263 	ReferenceDocu*
264 	ServiceDependency*
265 	Type*
266 }
267 
268 
269 */
270 
271 
272 
273 
274 
275 
276