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