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 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_idl.hxx" 30 31 #include <stdlib.h> 32 #include <stdio.h> 33 #include <string.h> 34 #include <ctype.h> 35 36 #include <command.hxx> 37 #include <globals.hxx> 38 #include <database.hxx> 39 #include <tools/fsys.hxx> 40 41 /************************************************************************* 42 |* 43 |* Syntaxbeschreibung 44 |* 45 *************************************************************************/ 46 char const * SyntaxStrings[] = { 47 "basic-type:", 48 "\tvoid| char| int| float| double|", 49 "\tUINT16| INT16| UINT32| INT32| BOOL|", 50 "\tBYTE| String| SbxObject", 51 "", 52 "{ import \"filename\" }\n", 53 "module definition:", 54 "module", 55 "\tunique id range (ask MM)", 56 "modul-name", 57 "'['", 58 "\tSlotIdFile( \"filename\" )", 59 "']'", 60 "'{'", 61 "\t{ include \"filename\" }\n", 62 63 "\titem definition:", 64 "\titem type item-name;\n", 65 66 "\ttype definition:", 67 "\tstruct | union identifier", 68 "\t'{'", 69 "\t\t{ type idetifier }", 70 "\t'}'", 71 "\t|", 72 "\tenum identifier", 73 "\t'{'", 74 "\t\t{ identifier, }", 75 "\t'}'", 76 "\t|", 77 "\ttypedef type identifier\n", 78 79 "\titem-method:", 80 "\titem identifier item-method-args\n", 81 82 "\titem-method-args:", 83 "\t( { item parameter-name SLOT_ID } )\n", 84 85 "\tslot definition:", 86 "\titem identifier SLOT_ID [ item-method-args ]", 87 "\t'['\n", 88 89 "\t\titem-method-args", 90 "\t\tAccelConfig, MenuConfig, StatusBarConfig, ToolbarConfig", 91 "\t\tAutomation*", 92 "\t\tAutoUpdate", 93 // "\t\tCachable*, Volatile", 94 "\t\tContainer", 95 "\t\tDefault = Identifier", 96 "\t\tExecMethod = Identifier", 97 "\t\tExport*", 98 "\t\tFastCall", 99 "\t\tGet, Set", 100 "\t\tGroupId = Identifier", 101 "\t\tHasCoreId", 102 "\t\tHasDialog", 103 "\t\tIsCollection", 104 "\t\tImageRotation", 105 "\t\tImageReflection", 106 "\t\tPseudoPrefix = Identifier", 107 "\t\tPseudoSlots", 108 "\t\tReadOnly", 109 "\t\tReadOnlyDoc*", 110 "\t\tRecordPerSet*, RecordPerItem, RecordManual, NoRecord", 111 "\t\tRecordAbsolute", 112 "\t\tStateMethod = Identifier", 113 "\t\tSynchron*, Asynchron", 114 "\t\tToggle", 115 "\t']'\n", 116 117 "\tinterface definition:", 118 "\tshell | interface identifier ':' interface", 119 "\t'{'", 120 "\t\t{ slot }", 121 "\t'}'\n", 122 "---syntax example is sfx.idl---\n", 123 NULL }; 124 125 char CommandLineSyntax[] = 126 "-fs<slotmap file> -fl<listing file>\n" 127 "-fo<odl file> -fd<data base file>\n" 128 "-fi<item implementation> -ft<type library file> (not OLE)\n" 129 "-fr<ressource file> -fm<makefile target file>\n" 130 "-fC<c++ source file> -fH<c++ header file>\n" 131 "-fc<c source file> -fh<c header file>\n" 132 "-rsc <*.srs header line>\n" 133 "-help, ? @<file> response file\n" 134 " <filenames>\n"; 135 136 /************************************************************************* 137 |* 138 |* Init() 139 |* 140 |* Beschreibung 141 |* Ersterstellung MM 15.12.94 142 |* Letzte Aenderung MM 15.12.94 143 |* 144 *************************************************************************/ 145 void Init() 146 { 147 if( !IDLAPP->pHashTable ) 148 IDLAPP->pHashTable = new SvStringHashTable( 2801 ); 149 if( !IDLAPP->pGlobalNames ) 150 IDLAPP->pGlobalNames = new SvGlobalHashNames(); 151 } 152 153 /************************************************************************* 154 |* 155 |* DeInit() 156 |* 157 |* Beschreibung 158 |* 159 *************************************************************************/ 160 void DeInit() 161 { 162 delete IDLAPP; 163 } 164 165 /************************************************************************* 166 |* 167 |* DeInit() 168 |* 169 |* Beschreibung 170 |* 171 *************************************************************************/ 172 sal_Bool ReadIdl( SvIdlWorkingBase * pDataBase, const SvCommand & rCommand ) 173 { 174 for( sal_uInt16 n = 0; n < rCommand.aInFileList.Count(); n++ ) 175 { 176 String aFileName ( *rCommand.aInFileList.GetObject( n ) ); 177 SvFileStream aStm( aFileName, STREAM_STD_READ | STREAM_NOCREATE ); 178 if( aStm.GetError() == SVSTREAM_OK ) 179 { 180 if( pDataBase->IsBinaryFormat( aStm ) ) 181 { 182 pDataBase->Load( aStm ); 183 if( aStm.GetError() != SVSTREAM_OK ) 184 { 185 ByteString aStr; 186 if( aStm.GetError() == SVSTREAM_FILEFORMAT_ERROR ) 187 aStr = "error: incompatible format, file "; 188 else if( aStm.GetError() == SVSTREAM_WRONGVERSION ) 189 aStr = "error: wrong version, file "; 190 else 191 aStr = "error during load, file "; 192 aStr += ByteString( aFileName, RTL_TEXTENCODING_UTF8 ); 193 fprintf( stderr, "%s\n", aStr.GetBuffer() ); 194 return sal_False; 195 } 196 } 197 else 198 { 199 SvTokenStream aTokStm( aStm, aFileName ); 200 if( !pDataBase->ReadSvIdl( aTokStm, sal_False, rCommand.aPath ) ) 201 return sal_False; 202 } 203 } 204 else 205 { 206 const ByteString aStr( aFileName, RTL_TEXTENCODING_UTF8 ); 207 fprintf( stderr, "unable to read input file: %s\n", aStr.GetBuffer() ); 208 return sal_False; 209 } 210 } 211 return sal_True; 212 } 213 214 /************************************************************************* 215 |* 216 |* SvCommand::SvCommand() 217 |* 218 |* Beschreibung 219 |* 220 *************************************************************************/ 221 static sal_Bool ResponseFile( StringList * pList, int argc, char ** argv ) 222 { 223 // Programmname 224 pList->Insert( new String( String::CreateFromAscii(*argv) ), LIST_APPEND ); 225 for( int i = 1; i < argc; i++ ) 226 { 227 if( '@' == **(argv +i) ) 228 { // wenn @, dann Response-Datei 229 SvFileStream aStm( String::CreateFromAscii((*(argv +i)) +1), STREAM_STD_READ | STREAM_NOCREATE ); 230 if( aStm.GetError() != SVSTREAM_OK ) 231 return sal_False; 232 233 ByteString aStr; 234 while( aStm.ReadLine( aStr ) ) 235 { 236 sal_uInt16 n = 0; 237 sal_uInt16 nPos = 1; 238 while( n != nPos ) 239 { 240 while( aStr.GetChar(n) && isspace( aStr.GetChar(n) ) ) 241 n++; 242 nPos = n; 243 while( aStr.GetChar(n) && !isspace( aStr.GetChar(n) ) ) 244 n++; 245 if( n != nPos ) 246 pList->Insert( new String( String::CreateFromAscii( aStr.Copy( nPos, n - nPos ).GetBuffer() ) ), LIST_APPEND ); 247 } 248 } 249 } 250 else if( argv[ i ] ) 251 pList->Insert( new String( String::CreateFromAscii( argv[ i ] ) ), LIST_APPEND ); 252 } 253 return sal_True; 254 } 255 256 /************************************************************************* 257 |* SvCommand::SvCommand() 258 |* 259 |* Beschreibung 260 *************************************************************************/ 261 SvCommand::SvCommand( int argc, char ** argv ) 262 : nVerbosity(1), nFlags( 0 ) 263 { 264 StringList aList; 265 266 if( ResponseFile( &aList, argc, argv ) ) 267 for( sal_uLong i = 1; i < aList.Count(); i++ ) 268 { 269 String aParam( *aList.GetObject( i ) ); 270 sal_Unicode aFirstChar( aParam.GetChar(0) ); 271 if( '-' == aFirstChar ) 272 { 273 aParam.Erase( 0, 1 ); 274 aFirstChar = aParam.GetChar(0); 275 if( aFirstChar == 'F' || aFirstChar == 'f' ) 276 { 277 aParam.Erase( 0, 1 ); 278 aFirstChar = aParam.GetChar(0); 279 String aName( aParam.Copy( 1 ) ); 280 if( 's' == aFirstChar ) 281 { // Name der Slot-Ausgabe 282 aSlotMapFile = aName; 283 } 284 else if( 'l' == aFirstChar ) 285 { // Name der Listing 286 aListFile = aName; 287 } 288 else if( 'i' == aFirstChar ) 289 { // Name der Item-Datei 290 // aSfxItemFile = aName; 291 } 292 else if( 'o' == aFirstChar ) 293 { // Name der ODL-Datei 294 // aODLFile = aName; 295 } 296 else if( 'd' == aFirstChar ) 297 { // Name der Datenbasis-Datei 298 aDataBaseFile = aName; 299 } 300 else if( 'D' == aFirstChar ) 301 { // Name der Docu-Datei f"ur das API 302 // aDocuFile = aName; 303 } 304 else if( 'C' == aFirstChar ) 305 { // Name der cxx-Datei 306 // aCxxFile = aName; 307 } 308 else if( 'H' == aFirstChar ) 309 { // Name der hxx-Datei 310 // aHxxFile = aName; 311 } 312 else if( 'c' == aFirstChar ) 313 { // Name der C-Header-Datei 314 // aCSourceFile = aName; 315 } 316 else if( 'h' == aFirstChar ) 317 { // Name der C-Header-Datei 318 // aCHeaderFile = aName; 319 } 320 else if( 't' == aFirstChar ) 321 { // Name der Info-Datei 322 // aCallingFile = aName; 323 } 324 else if( 'm' == aFirstChar ) 325 { // Name der Info-Datei 326 aTargetFile = aName; 327 } 328 else if( 'r' == aFirstChar ) 329 { // Name der Resource-Datei 330 // aSrcFile = aName; 331 } 332 else if( 'z' == aFirstChar ) 333 { // Name der HelpId-Datei 334 aHelpIdFile = aName; 335 } 336 else if( 'y' == aFirstChar ) 337 { // Name der CSV-Datei 338 aCSVFile = aName; 339 } 340 else if( 'x' == aFirstChar ) 341 { // Name der IDL-Datei fuer die CSV-Datei 342 aExportFile = aName; 343 } 344 else 345 { 346 printf( 347 "unknown switch: %s\n", 348 rtl::OUStringToOString( 349 aParam, RTL_TEXTENCODING_UTF8).getStr()); 350 exit( -1 ); 351 } 352 } 353 else if( aParam.EqualsIgnoreCaseAscii( "help" ) || aParam.EqualsIgnoreCaseAscii( "?" ) ) 354 { // Hilfe 355 printf( "%s", CommandLineSyntax ); 356 } 357 else if( aParam.EqualsIgnoreCaseAscii( "quiet" ) ) 358 { 359 nVerbosity = 0; 360 } 361 else if( aParam.EqualsIgnoreCaseAscii( "verbose" ) ) 362 { 363 nVerbosity = 2; 364 } 365 else if( aParam.EqualsIgnoreCaseAscii( "syntax" ) ) 366 { // Hilfe 367 int j = 0; 368 while(SyntaxStrings[j]) 369 printf("%s\n",SyntaxStrings[j++]); 370 } 371 else if( aParam.EqualsIgnoreCaseAscii( "i", 0, 1 ) ) 372 { // Include-Pfade definieren 373 String aName( aParam.Copy( 1 ) ); 374 if( aPath.Len() ) 375 aPath += DirEntry::GetSearchDelimiter(); 376 aPath += aName; 377 } 378 else if( aParam.EqualsIgnoreCaseAscii( "rsc", 0, 3 ) ) 379 { // erste Zeile im *.srs File 380 if( aList.GetObject( i +1 ) ) 381 { 382 aSrsLine = ByteString( *aList.GetObject( i +1 ), RTL_TEXTENCODING_UTF8 ); 383 i++; 384 } 385 } 386 else 387 { 388 // temporary compatibility hack 389 printf( 390 "unknown switch: %s\n", 391 rtl::OUStringToOString( 392 aParam, RTL_TEXTENCODING_UTF8).getStr()); 393 exit( -1 ); 394 } 395 } 396 else 397 { 398 aInFileList.Insert( new String( aParam ), LIST_APPEND ); 399 } 400 } 401 else 402 { 403 printf( "%s", CommandLineSyntax ); 404 } 405 406 String * pStr = aList.First(); 407 while( pStr ) 408 { 409 delete pStr; 410 pStr = aList.Next(); 411 } 412 413 ByteString aInc( getenv( "INCLUDE" ) ); 414 // Include Environmentvariable anhaengen 415 if( aInc.Len() ) 416 { 417 if( aPath.Len() ) 418 aPath += DirEntry::GetSearchDelimiter(); 419 aPath += String::CreateFromAscii( aInc.GetBuffer() ); 420 } 421 } 422 423 /************************************************************************* 424 |* 425 |* SvCommand::~SvCommand() 426 |* 427 |* Beschreibung 428 |* 429 *************************************************************************/ 430 SvCommand::~SvCommand() 431 { 432 // ByteString Liste freigeben 433 String * pStr; 434 while( NULL != (pStr = aInFileList.Remove()) ) 435 delete pStr; 436 } 437 438