Index: xmlhelp/source/cxxhelp/provider/makefile.mk =================================================================== --- xmlhelp/source/cxxhelp/provider/makefile.mk.orig 2003-04-28 18:19:35.000000000 +0200 +++ xmlhelp/source/cxxhelp/provider/makefile.mk 2004-01-08 00:36:53.000000000 +0100 @@ -74,6 +74,9 @@ NO_BSYMBOLIC=TRUE .INCLUDE: settings.mk CFLAGS += -DHAVE_EXPAT_H +.IF "$(SYSTEM_DB)" == "YES" +CFLAGS += -DSYSTEM_DB -I$(DB_INCLUDES) +.ENDIF .IF "$(GUI)"=="WNT" CFLAGS+=-GR --- /dev/null 2003-12-04 23:59:45.000000000 +0100 +++ xmlhelp/source/com/sun/star/help/db4/CreateDb.java 2004-01-22 22:48:17.000000000 +0100 @@ -0,0 +1,199 @@ + +/** + * Title: Help Content Provider

+ * Description:

+ * Copyright: Copyright (c) Andreas Bille ( abi )

+ * Company: Sun Microsystems. Inc

+ * @author Andreas Bille ( abi ) + * @version 1.0 + */ +package com.sun.star.help; + +import java.io.*; +import com.sleepycat.db.*; + +public class CreateDb { + + public CreateDb() + { + } + + + + void iterate( String dbName ) + { + System.out.println( dbName ); + Db table = null; + try + { + table = new Db( null,0 ); + } + catch( DbException e ) + { + System.out.println( "Error initializing database" ); + } + + table.set_error_stream( System.err ); + table.set_errpfx( "HelpAccess" ); + try + { + table.open( null, dbName,null,Db.DB_BTREE,Db.DB_RDONLY,0644 ); + Dbc cursor = table.cursor( null,0 ); + + StringDbt key = new StringDbt(); + StringDbt data = new StringDbt(); + // + boolean first = true; + key.set_flags( Db.DB_DBT_MALLOC ); // The cursor must allocate the necessary memory + data.set_flags( Db.DB_DBT_MALLOC ); + String filePrefix = System.getProperty( "com.sun.star.help.Directory" ); + File outFile = new File( "e:/helpdata/test1/filelist" ); + try + { + outFile.createNewFile(); + } + catch( IOException e ) + { + e.printStackTrace(); + } + + FileWriter outStream = null; + try + { + outStream = new FileWriter( outFile ); + } + catch( IOException e ) + { + e.printStackTrace(); + } + + while( Db.DB_NOTFOUND != cursor.get( key,data,Db.DB_NEXT ) ) + { + // String keyStr = new String( key.get_data(),0,key.get_size() ); + // String dataStr = new String( data.get_data(),0,data.get_size() ); + + String keyStr = key.getString(); + String dataStr = data.getString(); + String testStr1 = data.getFile(); + String testStr2 = data.getDatabase(); + String testStr3 = data.getTitle(); + if( ! testStr3.equals("") ) + System.out.println( keyStr + " " + testStr1 + " " + testStr2 + " " + testStr3 ); + + String fileStr = filePrefix + "49/" + dataStr; + File aFile = new File( fileStr ); + if( aFile.exists() ) + { + System.out.println( keyStr + " " + dataStr ); + outStream.write( keyStr + " " + dataStr ); + } + if( first ) + { + key.set_flags( Db.DB_DBT_REALLOC ); + data.set_flags( Db.DB_DBT_REALLOC ); + first = false; + } + } + } + catch( DbRunRecoveryException e ) + { + System.out.println( "Not able to create cursor: " + e.getMessage() ); + } + catch (DbException dbe) + { + System.err.println("HelpAccess: " + dbe.toString()); + System.exit(1); + } + catch (FileNotFoundException fnfe) + { + System.err.println("HelpAccess: " + fnfe.toString()); + System.exit(1); + } + catch( IOException e ) + { + e.printStackTrace(); + } + } + + + + public static void CreateDatabase() + { + String key1 = "1234"; + String data1 = "dumm/start.xml"; + String key2 = "4321"; + String data2 = "blub/embedded.xml"; + String key3 = "1235"; + String data3 = "dumm/testpage.xml"; + + try + { + Db table = new Db(null, 0); + table.set_error_stream(System.err); + table.set_errpfx("AccessExample"); + table.open( null, "e:/rvp603b/help/helpaccess.db", null, Db.DB_HASH, Db.DB_CREATE, 0644); + StringDbt key = new StringDbt(key1); + StringDbt data = new StringDbt(data1); + try + { + int err; + if ((err = table.put(null, key, data, 0)) == Db.DB_KEYEXIST) + { + System.out.println("Key " + " already exists."); + } + } + catch (DbException dbe) + { + System.out.println(dbe.toString()); + } + System.out.println(" inserted first key "); + + + key = new StringDbt(key2); + data = new StringDbt(data2); + try + { + int err; + if ((err = table.put(null, key, data, 0)) == Db.DB_KEYEXIST) + { + System.out.println("Key " + " already exists."); + } + } + catch (DbException dbe) + { + System.out.println(dbe.toString()); + } + System.out.println(" inserted second key "); + + + key = new StringDbt(key3); + data = new StringDbt(data3); + try + { + int err; + if ((err = table.put(null, key, data, 0)) == Db.DB_KEYEXIST) + { + System.out.println("Key " + " already exists."); + } + } + catch (DbException dbe) + { + System.out.println(dbe.toString()); + } + System.out.println(" inserted third key "); + + + table.close(0); + } + catch (DbException dbe) + { + System.err.println("AccessExample: " + dbe.toString()); + System.exit(1); + } + catch (FileNotFoundException fnfe) + { + System.err.println("AccessExample: " + fnfe.toString()); + System.exit(1); + } + } +} --- /dev/null 2003-12-04 23:59:45.000000000 +0100 +++ xmlhelp/source/com/sun/star/help/db4/HelpIndexer.java 2004-01-22 22:48:17.000000000 +0100 @@ -0,0 +1,774 @@ +/** + * Title:

+ * Description:

+ * Copyright: Copyright (c)

+ * Company:

+ * @author + * @version 1.0 + */ +package com.sun.star.help; + + +import java.io.*; +import java.net.URL; +import java.util.*; + +import org.w3c.dom.*; +import com.sun.xml.tree.*; +import org.xml.sax.*; +import javax.xml.parsers.*; +import com.jclark.xsl.sax.*; + +import com.sun.xmlsearch.util.*; +import com.sun.xmlsearch.xml.qe.*; +import com.sun.xmlsearch.xml.indexer.*; + +import com.sleepycat.db.*; +import com.sun.star.help.HelpURLStreamHandlerFactory; + +public class HelpIndexer { + + private HelpURLStreamHandlerFactory _urlHandler = null; + private String _language = null, _module = null, _system = null; + + + public HelpIndexer( HelpURLStreamHandlerFactory urlHandler,String language, String module, String system ) + { + _urlHandler = urlHandler; + _system = system; + _language = language; + _module = module; + } + + + private final class TagInfo + { + String _tag,_id; + + public TagInfo( String id,String tag ) + { + _tag = tag; + _id = id; + } + + public String get_tag() + { + return _tag; + } + + public String get_id() + { + return _id; + } + } + + + private final class DocInfo + { + private String _url = null,_id = null; + + private ArrayList _helptags = new ArrayList(); + + + public void append( String id,String tag ) + { + _helptags.add( new TagInfo( id,tag ) ); + } + + + public String getURL() + { + return _url; + } + + public void setURL( String url ) + { + _url = url; + } + + public void setId( String id ) + { + _id = id; + } + + public String getId() + { + return _id; + } + + public ArrayList getAppendices() + { + return _helptags; + } + } + + + Hashtable _hashDocInfo = new Hashtable(); + Hashtable _hashHelptext = new Hashtable(); + + + private void schnitzel() + { + // Determine the location of the database + String installDirectory = HelpDatabases.getInstallDirectory(); + Db table = null; + + try + { + table = new Db( null,0 ); + table.set_error_stream( System.err ); + table.set_errpfx( "indexing" ); + + + // Create indexDirectory, if not existent + String indexDirectory = installDirectory + _language + File.separator + _module + ".idx"; + File indexDir = new File( indexDirectory ); + if( indexDir.exists() && indexDir.isFile() ) + indexDir.delete(); + + if( ! indexDir.exists() ) + indexDir.mkdir(); + + indexDir = null; + + // Initialize the indexBuilder + XmlIndexBuilder builder = new XmlIndexBuilder( indexDirectory ); + + String[] translations = { "vnd.sun.star.help://", "#HLP#" }; + PrefixTranslator translator = PrefixTranslator.makePrefixTranslator( translations ); + builder.setPrefixTranslator( translator ); + + builder.clearIndex(); // Build index from scratch + builder.setTransformLocation( installDirectory + "..\\StyleSheets\\Indexing\\" ); + builder.init( "index" ); + + + // Determine and read the database + String fileName = installDirectory + + _language + + File.separator + + _module + + ".db"; + + table.open( null, fileName,null,Db.DB_BTREE,Db.DB_RDONLY,0644 ); + Dbc cursor = table.cursor( null,0 ); + StringDbt key = new StringDbt(); + StringDbt data = new StringDbt(); + + boolean first = true; + key.set_flags( Db.DB_DBT_MALLOC ); // Initially the cursor must allocate the necessary memory + data.set_flags( Db.DB_DBT_MALLOC ); + while( Db.DB_NOTFOUND != cursor.get( key,data,Db.DB_NEXT ) ) + { + try + { + String keyStr = key.getString(); + String dataStr = data.getFile(); + String tagStr = data.getHash(); + + DocInfo info = ( DocInfo ) _hashDocInfo.get( dataStr ); + + if( info == null ) + { + info = new DocInfo(); + _hashDocInfo.put( dataStr,info ); + } + + if( ! tagStr.equals( "" ) ) + info.append( keyStr,tagStr ); + else + { + String url = "vnd.sun.star.help://" + _module + "/" + keyStr + "?Language=" + _language; + info.setURL( url ); + info.setId( keyStr ); + } + } + catch( Exception e ) + { + } + if( first ) + { + key.set_flags( Db.DB_DBT_REALLOC ); + data.set_flags( Db.DB_DBT_REALLOC ); + first = false; + } + } + cursor.close(); + table.close( 0 ); + + System.out.println( "Indexing..." ); + Enumeration enum = _hashDocInfo.elements(); + int cut = 0; + while( enum.hasMoreElements() && cut < 100000000 ) + { + try + { + DocInfo info = ( DocInfo ) enum.nextElement(); + String url = info.getURL(); + if( url == null ) + { + System.out.println( "<----------------------------------->" ); + System.out.println( "big error: found helptext without URL" ); + System.out.println( "<----------------------------------->" ); + continue; + } + cut++; + + _urlHandler.setMode( null ); + byte[] embResolved = getSourceDocument( url ); +// InputSource in = new InputSource( new ByteArrayInputStream( embResolved ) ); + + ByteArrayInputStream inbyte = new ByteArrayInputStream(embResolved); + InputStreamReader inread; + try + { + inread = new InputStreamReader( inbyte,"UTF8" ); + } + catch( UnsupportedEncodingException e ) + { + inread = new InputStreamReader( inbyte ); + } + InputSource in = new InputSource( inread ); + + in.setEncoding( "UTF8" ); + Document docResolved = null; + try + { + docResolved = XmlDocument.createXmlDocument( in,false ); + } + catch( Exception e ) + { + if( docResolved == null ) + System.err.println( "Nullpointer" ); + + System.err.println( e.getMessage() ); + } + + String id = info.getId(); + if( id == null ) + System.out.println( "Found tag without valid id" ); + else + addKeywords( docResolved,info.getId() ); + + Object[] attrList = info.getAppendices().toArray(); + for( int i = 0; i < attrList.length; ++i ) + { + TagInfo tag = ( TagInfo ) attrList[i]; + Node node = extractHelptext( docResolved,tag.get_tag() ); + if( node != null ) + { + String text = dump(node); + _hashHelptext.put( tag.get_id(),text ); + } + } + _urlHandler.setMode( embResolved ); + + int idx = url.indexOf( '?' ); + if( idx != -1 ) + url = url.substring( 0,idx ); + System.out.println( url ); + builder.indexDocument( new URL( url ),"" ); + } + catch( Exception e ) + { + System.err.println( e.getMessage() ); + } + } + + try + { + dumpHelptext(); + _keywords.dump(); + builder.close(); + } + catch( Exception e ) + { + System.err.println( e.getMessage() ); + } + } + catch( DbRunRecoveryException e ) + { + System.out.println( "Not able to create cursor: " + e.getMessage() ); + System.exit(1); + } + catch( DbException e ) + { + System.out.println( "Error initializing database" ); + System.exit(1); + } + catch (FileNotFoundException fnfe) + { + System.err.println("HelpAccess: " + fnfe.getMessage() ); + System.exit(1); + } + catch( java.lang.Exception e ) + { + System.out.println( "any other exception" + e.getMessage() ); + } + } + + + + private final class NodeIterator + { + private final class StackElement + { + public boolean _isDone; + public Node _node; + + StackElement( Node node ) + { + _isDone = false; + _node = node; + } + } + + private Stack stack = new Stack(); + + public NodeIterator( Node node ) + { + stack.push( new StackElement(node) ); + } + + void change() + { + ((StackElement)(stack.peek()))._isDone = true; + NodeList top = ((StackElement)(stack.peek()))._node.getChildNodes(); + for( int i = top.getLength()-1; i >= 0; --i ) + stack.push( new StackElement( top.item(i) ) ); + } + + public Node next() + { + if( stack.empty() ) return null; + while( ! ((StackElement)(stack.peek()))._isDone ) change(); + return ((StackElement)stack.pop())._node; + } + } + + + /** + * Given a dom of the document, the next Help:Helptext following Help:HelpID value="tag" is extracted + */ + + private Node extractHelptext( Node node,String tag ) + { + boolean found = false; + Node test; + NodeIterator it = new NodeIterator( node ); + while( ( test=it.next() ) != null ) + { + if( !found && test.getNodeName().equals("help:help-id" ) && ((Element)test).getAttribute("value").equals(tag) ) + found = true; + if( found && test.getNodeName().equals("help:help-text") ) + return test; + } + return null; + } + + + private final class Keywords + { + private Hashtable _hash = new Hashtable(); + + class Data + { + int pos = 0; + String[] _idList = new String[5]; + + void append( String id ) + { + if( pos == _idList.length ) + { + String[] buff = _idList; + _idList = new String[ pos + 5 ]; + for( int i = 0; i < buff.length; ++i ) + _idList[i] = buff[i]; + buff = null; + } + _idList[ pos++] = id; + } + + + int getLength() + { + return pos; + } + + String getString() + { + String ret = new String(); + for( int i = 0; i < pos; ++i ) + { + ret += ( _idList[i] + ";" ); + } + return ret; + } + } // end class data + + + public void insert( String key, String id ) + { + Data data = (Data)_hash.get(key); + if( data == null ) + { + data = new Data(); + _hash.put( key,data ); + } + data.append( id ); + } + + + void dump() + { + Enumeration enum = _hash.keys(); + int j = 0; + String[] list = new String[ _hash.size() ]; + while( enum.hasMoreElements() ) + { + list[j++] = ( String ) enum.nextElement(); + } + + Db table; + try + { + table = new Db( null,0 ); + + String fileName = HelpDatabases.getInstallDirectory() + + _language + + File.separator + + _module + + ".key"; + + table.open( null, fileName,null,Db.DB_BTREE,Db.DB_CREATE,0644 ); + + for( int i = 0; i < list.length; ++i ) + { + Data data = ( Data ) _hash.get( list[i] ); + StringDbt key = new StringDbt( list[i] ); + StringDbt value = new StringDbt( data.getString() ); + table.put( null,key,value,0); + } + table.close( 0 ); + } + catch( Exception e ) + { + System.out.println( "error writing keydata" ); + } + } + + } + + + void dumpHelptext() + { + Enumeration enum = _hashHelptext.keys(); + int j = 0; + String[] list = new String[ _hashHelptext.size() ]; + while( enum.hasMoreElements() ) + { + list[j++] = ( String ) enum.nextElement(); + } + + Db table; + try + { + table = new Db( null,0 ); + + String fileName = HelpDatabases.getInstallDirectory() + + _language + + File.separator + + _module + + ".ht"; + + table.open( null, fileName,null,Db.DB_BTREE,Db.DB_CREATE,0644 ); + + for( int i = 0; i < list.length; ++i ) + { + String data = ( String ) _hashHelptext.get( list[i] ); + StringDbt key = new StringDbt( list[i] ); + StringDbt value = new StringDbt( data ); + table.put( null,key,value,0); + } + table.close( 0 ); + } + catch( Exception e ) + { + System.out.println( "error writing keydata" ); + } + } + + + + + Keywords _keywords = new Keywords(); + + private void addKeywords( Node node,String id ) + { + Node test; + NodeIterator it = new NodeIterator( node ); + while( ( test=it.next() ) != null ) + { + if( test.getNodeName().equals( "help:key-word" ) ) + { + Element element = ( Element ) test; + + String isEmbedded = element.getAttribute( "embedded" ); + + if( isEmbedded != null && isEmbedded.equals( "false" ) ) + { + String keyword = element.getAttribute( "value" ); + String getJump = element.getAttribute( "tag" ); + + if( ! keyword.equals("") && !id.equals("") ) + _keywords.insert( keyword,id + "#" + getJump ); + } + } + } + } + + + + /** + * Returns a textual representation of + * the node + */ + + + private String dump( Node node ) + { + String app = new String(); + if( node.hasChildNodes() ) + { + NodeList list = node.getChildNodes(); + for( int i = 0; i < list.getLength(); ++ i ) + app += dump( list.item(i) ); + } + if( node.getNodeType() == Node.ELEMENT_NODE ) + { + /* + String start = "<" + node.getNodeName(); + NamedNodeMap attr = node.getAttributes(); + for( int j = 0; j < attr.getLength(); ++j ) + { + start += ( " " + ((Attr)attr.item(j)).getName()+"=\"" + ((Attr)attr.item(j)).getValue() + "\""); + } + start += ">"; + String end = ""; + + return start + app + end; + */ + } + else if( node.getNodeType() == Node.TEXT_NODE ) + { + return ((Text)node).toString(); + } + return app; + } + + + + // This is a configurable class, which capsulates the parser initialization stuff and all this things + + public static final class ParseStuff + { + private final XSLProcessor _processor; + private final OutputMethodHandlerImpl _output; + + + private ParseStuff() + { + _processor = new XSLProcessorImpl(); + + // Determine the parser + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setValidating( false ); + try + { + _processor.setParser( spf.newSAXParser().getParser() ); + } + catch( java.lang.Exception e ) + { + System.err.println( "" ); + System.exit( 1 ); + } + + // Determine the OutputMethodHandler + _output = new OutputMethodHandlerImpl( _processor ); + _processor.setOutputMethodHandler( _output ); + } + + // Loading from a URL + public ParseStuff( URL url ) + { + this(); + try + { + _processor.loadStylesheet( new InputSource( url.toExternalForm() ) ); + } + catch( SAXException e ) + { + System.err.println( "" ); + System.err.println( e.getMessage() ); + System.exit( 1 ); + } + catch( java.io.IOException e ) + { + System.err.println( "" ); + System.err.println( e.getMessage() ); + System.exit( 1 ); + } + System.out.println( "Using stylesheet: " + url.toExternalForm() ); + } + + + // Loading from a file + public ParseStuff( String styleSheet ) + { + this(); + try + { + _processor.loadStylesheet( new InputSource( new FileInputStream( styleSheet ) ) ); + } + catch( SAXException e ) + { + System.err.println( "" ); + System.err.println( e.getMessage() ); + System.exit( 1 ); + } + catch( java.io.IOException e ) + { + System.err.println( "" ); + System.exit( 1 ); + } + System.out.println( "Using stylesheet: " + styleSheet ); + } + + + public byte[] parse( String url ) + { + InputSource _in = new InputSource( url ); + _in.setEncoding( "UTF-8" ); + + + HelpOutputStream _out = new HelpOutputStream(); + try + { + // OutputStreamDestination _dest = new OutputStreamDestination( _out ); + HelpProvider.ProviderDestination _dest = new HelpProvider.ProviderDestination( _out,"UTF-8" ); + synchronized( this ) + { + _output.setDestination( _dest ); + _processor.parse( _in ); + _out.flush(); + } + } + catch( java.io.IOException e ) + { + System.err.println( "no file corresponding to URL exists: " + url ); + System.err.println( "no file corresponding to URL exists: " + e.getMessage() ); + // System.exit( 1 ); + } + catch( SAXException e ) + { + System.err.println( "ill formed xml document: " + e.getMessage() ); + System.err.println( " url: " + url ); + // System.exit( 1 ); + } + catch( Exception e ) + { + System.err.println( "any other exception" ); + System.err.println( e.getMessage() ); + } + + return _out.getBigBuffer(); + } + + + public void setParameter( String key,Object value ) + { + _processor.setParameter( key,value ); + } + + } // end class ParseStuff + + + + /** + * Returns the embedding resolved document + */ + + ParseStuff _stuff = null; + + byte[] getSourceDocument( String url ) + { + // Initialize + if( _stuff == null ) + { + String styleSheet = HelpDatabases.getInstallDirectory() + "..\\StyleSheets\\Indexing\\ResEmb.xsl"; + _stuff = new ParseStuff( styleSheet ); + + // Setting the parameters + _stuff.setParameter( "Language", _language ); + _stuff.setParameter( "Database", _module ); + } + + // and parse + return _stuff.parse( url ); + } + + + + + // Now has to be settled up + public static void main( String[] args ) throws Exception + { + System.setProperty( "XMLSEARCH", HelpDatabases.getInstallDirectory() ); + if( args.length != 6 ) + { + System.out.println( "Usage example: main -language de -module swriter -system WIN" ); + System.exit( 1 ); + } + + String language = null,module = null, system = null; + + for( int i = 0; i < 5; i+=2 ) + { + if( args[i].trim().equals( "-language" ) ) + language = args[i+1]; + else if( args[i].trim().equals( "-module" ) ) + module = args[i+1]; + else if( args[i].trim().equals( "-system" ) ) + system = args[i+1]; + } + + if( language == null || module == null || system == null ) + { + System.out.println( "Usage example: main -language de -module swriter -system WIN" ); + System.exit( 1 ); + } + else + { + System.out.println( " Configuring for \"system\" = " + system); + System.out.println( " \"module\" = " + module); + System.out.println( " \"language\" = " + language); + } + + try + { + String urlmode = HelpDatabases.getURLMode(); + HelpURLStreamHandlerFactory urlHandler = new HelpURLStreamHandlerFactory( urlmode ); + URL.setURLStreamHandlerFactory( urlHandler ); + + HelpIndexer helpIndexer = new HelpIndexer( urlHandler,language,module,system ); + + // helpIndexer.indexDatabase(); + helpIndexer.schnitzel(); + } + catch( Exception e ) + { + e.printStackTrace(); + } + } +} + --- /dev/null 2003-12-04 23:59:45.000000000 +0100 +++ xmlhelp/source/com/sun/star/help/db4/HelpDatabases.java 2004-01-22 22:48:17.000000000 +0100 @@ -0,0 +1,590 @@ +package com.sun.star.help; + +import com.sleepycat.db.*; +import java.io.*; +import java.util.*; +import java.util.jar.*; + + +public final class HelpDatabases +{ + // The office installation directory for the help system + // Has to be read from the configuration + private static String _installDirectory = System.getProperty( "com.sun.star.help.Directory" ); + + public static synchronized void setInstallPath( String _dir ) + { + _installDirectory = _dir; + } + + // Holds the databases for the different languages; + private static final Hashtable _dbHash = new Hashtable(); + + // The same for the jar files + private static final Hashtable _jarHash = new Hashtable(); + + + public static final class StaticModuleInformation + { + private String _startId; + private String _programSwitch; + private String _title; + private String _heading; + private String _fulltext; + + public StaticModuleInformation( String title, + String startId, + String programSwitch, + String heading, + String fulltext ) + { + _title = title; + _startId = startId; + _programSwitch = programSwitch; + _heading = heading; + _fulltext = fulltext; + } + + public String get_title() { return _title; } + public String get_id() { return _startId; } + public String get_program() { return _programSwitch; } + public String get_heading() { return _heading; } + public String get_fulltext() { return _fulltext; } + } + + + public static final Hashtable _modInfo = new Hashtable(); + + + + public static String getURLMode() + { + return new String( "with-jars" ); + + // return new String( "with-files" ); + } + + + + private static final class DbFilter implements FilenameFilter + { + public boolean accept( File dir, String name ) + { + if( dir.exists() && ends( name ) ) + return true; + else + return false; + } + + boolean ends( String name ) + { + int idx = name.lastIndexOf( '.' ); + if( ( name.charAt( idx + 1 ) == 'd' || + name.charAt( idx + 1 ) == 'D' ) && + ( name.charAt( idx + 2 ) == 'b' || + name.charAt( idx + 2 ) == 'B' ) ) + { + if( name.substring(0,idx).toLowerCase().equals("picture") ) + return false; + + return true; + } + else + return false; + } + } + + + public static String[] getModuleList( String Language ) + { + String dirName = _installDirectory + lang( Language ); + File dirFile = new File( dirName ); + if( dirFile.isDirectory() ) + return dirFile.list( new DbFilter() ); + else + return null; + } + + public static String getInstallDirectory() + { + return _installDirectory; + } + + + public static final HashSet langSet = new HashSet(); + + + public static synchronized String lang( String Language ) + { + String ret = Language; + if( ! langSet.contains( ret ) ) + { + if( ! (new File( _installDirectory + ret )).exists() ) + { + int idx; + if( ( idx = ret.indexOf( '-' ) ) != -1 || // Only one is true + ( idx = ret.indexOf( '_' ) ) != -1 ) + ret = ret.substring( 0,idx ); + } + langSet.add( ret ); + } + + return ret; + } + + + public static synchronized StaticModuleInformation getStaticInformationForModule( String Module, String Language ) + { + String key = lang(Language) + File.separator + Module; + StaticModuleInformation info = ( StaticModuleInformation ) _modInfo.get( key ); + if( info == null ) + { + String cfgDat = _installDirectory + key + ".cfg"; + FileInputStream cfgFile = null; + try + { + cfgFile = new FileInputStream( cfgDat ); + } + catch( FileNotFoundException e ) + { + e.printStackTrace(); + } + try + { + InputStreamReader input; + try + { + input = new InputStreamReader( cfgFile,"UTF8" ); + } + catch( UnsupportedEncodingException e ) + { + input = new InputStreamReader( cfgFile ); + } + + String fileContent = new String(); + char[] buffer = new char[128]; + while( input.read( buffer,0,128 ) != -1 ) + { + fileContent += new String( buffer ); + buffer = new char[128]; + } + input.close(); + cfgFile.close(); + + String current = new String(); + String lang = null,program = null,startid = null,title = null,heading = "",fulltext=""; + for( int i = 0; i < fileContent.length(); ++i ) + { + char ch = fileContent.charAt( i ); + if( ch == '\n' || ch == '\r' ) + { + if( current.length() != 0 ) + { + // Something to interpret + if( current.startsWith( "Title" ) ) + { + title = current.substring( current.indexOf('=') + 1 ); + } + else if( current.startsWith( "Start" ) ) + { + startid = current.substring( current.indexOf('=') + 1 ); + } + else if( current.startsWith( "Language" ) ) + { + lang = current.substring( current.indexOf('=') + 1 ); + } + else if( current.startsWith( "Program" ) ) + { + program = current.substring( current.indexOf('=') + 1 ); + } + else if( current.startsWith( "Heading" ) ) + { + heading = current.substring( current.indexOf('=') + 1 ); + } + else if( current.startsWith( "FullText" ) ) + { + fulltext = current.substring( current.indexOf('=') + 1 ); + } + } + current = new String(); + } + else + current += ch; + } + info = new StaticModuleInformation( title,startid,program,heading,fulltext ); + _modInfo.put( key,info ); + } + catch( Exception e ) + { + System.err.println( "Corrupted cfg-file: " + cfgDat ); + e.printStackTrace(); + } + } + + return info; + } + + + + public static synchronized Db getDatabaseForLanguage( String Database,String Language ) + { + if( Database == null || Language == null ) + return null; + String key = lang(Language) + File.separator + Database; // For example de/swriter + Db table = ( Db ) _dbHash.get( key ); + if( table == null ) + { + try + { + table = new Db( null,0 ); + + String tablePath = _installDirectory + key + ".db"; + table.open( null, tablePath,null,Db.DB_BTREE,Db.DB_RDONLY,0644 ); + _dbHash.put( key,table ); + } + catch( DbException e ) + { + System.err.println( "Unsupported language in helpsystem: " + Language ); + System.err.println( "module: " + Database ); + System.err.println( e.getMessage() ); + } + catch( FileNotFoundException e ) + { + System.err.println( "Unsupported language in helpsystem: " + Language ); + System.err.println( "module: " + Database ); + System.err.println( e.getMessage() ); + } + } + + return table; + } + + + static Hashtable _helptextHash = new Hashtable(); + + + public static synchronized Db getHelptextDbForLanguage( String Database,String Language ) + { + String key = lang( Language ) + File.separator + Database; // For example de/swriter + Db table = ( Db ) _helptextHash.get( key ); + if( table == null ) + { + try + { + table = new Db( null,0 ); + + String tablePath = _installDirectory + key + ".ht"; + table.open( null, tablePath,null,Db.DB_BTREE,Db.DB_RDONLY,0644 ); + _dbHash.put( key,table ); + } + catch( DbException e ) + { + System.err.println( "Unsupported language in helpsystem: " + Language ); + System.err.println( "module: " + Database ); + System.err.println( e.getMessage() ); + } + catch( FileNotFoundException e ) + { + System.err.println( "Unsupported language in helpsystem: " + Language ); + System.err.println( "module: " + Database ); + System.err.println( e.getMessage() ); + } + } + + return table; + } + + + + public static synchronized JarFile getJarFileForLanguage( String Database,String Language ) + { + if( Language == null || Database == null ) + return null; + + String key = lang(Language) + File.separator + Database; + JarFile jarFile = ( JarFile ) _jarHash.get( key ); + if( jarFile == null ) + { + try + { + File file = new File( _installDirectory + key ); + if( file.exists() ) + { + jarFile = new JarFile( file ); + _jarHash.put( key,jarFile ); + } + else + throw new java.io.IOException(); + } + catch( IOException e ) + { + System.err.println( "Jarfile not found: " + Database + " " + Language ); + } + } + + return jarFile; + } + + + public static InputStream getCssSheet() + { + try + { + return new FileInputStream( _installDirectory + "custom.css" ); + } + catch( FileNotFoundException e ) + { + return null; + } + } + + + public static InputStream errorFile( String Language ) + { + try + { + return new FileInputStream( _installDirectory + lang(Language) + File.separator + "err.html" ); + } + catch( IOException e ) + { + String errorFile = + " "+ + " The requested document does not exist in the database !! "+ + " "; + + return new ByteArrayInputStream( errorFile.getBytes() ); + } + } + + + + public static InputStream popupDocument( HelpURLParameter xPar ) + { +// String popupFile = +// " "+ +// " " + +// " " + +// 1 " "; + + String popupFile = + " "+ + " "+ + " "+ + " "+ + " "+ + " "+ + " "+ + " "; + + System.out.println( popupFile ); + + return new ByteArrayInputStream( popupFile.getBytes() ); + } + + + private static final Hashtable _keyword = new Hashtable(); + + + public static final class KeywordInfo + { + int pos = 0; + String[] listKey = new String[100]; + String[][] listId; + String[][] listAnchor; + String[][] listTitle; + + public String [] getKeywordList() + { + return listKey; + } + + public String[][] getIdList() + { + return listId; + } + + + public String[][] getAnchorList() + { + return listAnchor; + } + + public String[][] getTitleList() + { + return listTitle; + } + + private void realloc( int length ) + { + String[] buff = listKey; + listKey = new String[ length ]; + int count = ( listKey.length > buff.length ) ? buff.length : listKey.length; + for( int i = 0; i < count; ++i ) + listKey[i] = buff[i]; + buff = null; + } + + + public String[] getTitleForIndex( int i ) + { + return listTitle[i]; + } + + + void insert( String id ) + { + if( pos == listKey.length ) + realloc( pos + 100 ); + listKey[ pos++ ] = id; + } + + + public String[] insertId( int index,String ids ) + { + int pos = 0; + String[] test = new String[10]; + while( ids != null && ids.length() != 0 ) + { + int idx = ids.indexOf( ';' ); + if( pos == test.length ) + { + String[] buff = test; + test = new String[ pos+10 ]; + for( int i = 0; i < buff.length; ++i ) + test[i] = buff[i]; + buff = null; + } + + test[pos++] = ids.substring(0,idx); + ids = ids.substring( 1+idx ); + } + + String[] buff = test; + test = new String[ pos ]; + for( int i = 0; i < pos; ++i ) + test[i] = buff[i]; + + listId[index] = test; + listAnchor[index] = new String[test.length]; + + for( int k = 0; k < listId[index].length; ++k ) + { + if( listId[index][k] == null ) + { + listId[index][k] = ""; + listAnchor[index][k] = ""; + } + else + { + int idx = listId[index][k].indexOf('#'); + if( idx != -1 ) + { + listAnchor[index][k] = listId[index][k].substring(1+idx).trim(); + listId[index][k] = listId[index][k].substring(0,idx).trim(); + } + else + listAnchor[index][k] = ""; + } + } + + listTitle[index] = new String[test.length]; + return test; + } + + + + public void sort() + { + realloc( pos ); + Arrays.sort( listKey ); + listId = new String[ listKey.length ][]; + listAnchor = new String[ listKey.length ][]; + listTitle = new String[ listKey.length ][]; + } + } + + + public static synchronized KeywordInfo getKeyword( String Database, String Language ) + { + String keyStr = lang(Language) + File.separator + Database; + KeywordInfo info = ( KeywordInfo ) _keyword.get( keyStr ); + + if( info == null ) + { + try + { + HashMap internalHash = new HashMap(); + String fileName = HelpDatabases.getInstallDirectory() + keyStr + ".key"; + Db table = new Db( null,0 ); + System.err.println( fileName ); + table.open( null, fileName,null,Db.DB_BTREE,Db.DB_RDONLY,0644 ); + Dbc cursor = table.cursor( null,0 ); + StringDbt key = new StringDbt(); + StringDbt data = new StringDbt(); + + boolean first = true; + key.set_flags( Db.DB_DBT_MALLOC ); // Initially the cursor must allocate the necessary memory + data.set_flags( Db.DB_DBT_MALLOC ); + info = new KeywordInfo(); + + String keyStri; + + while( Db.DB_NOTFOUND != cursor.get( key,data,Db.DB_NEXT ) ) + { + keyStri = key.getString(); + info.insert( keyStri ); + internalHash.put( keyStri,data.getString() ); + if( first ) + { + key.set_flags( Db.DB_DBT_REALLOC ); + data.set_flags( Db.DB_DBT_REALLOC ); + first = false; + } + } + + info.sort(); + cursor.close(); + table.close( 0 ); + + String[] keywords = info.getKeywordList(); + Db table2 = getDatabaseForLanguage( Database,Language ); + for( int i = 0; i < keywords.length; ++i ) + { + String[] id = info.insertId( i,((String)internalHash.get( keywords[i])) ); + String[] title = info.getTitleForIndex( i ); + + for( int j = 0; j < id.length; ++j ) + { + StringDbt key1 = new StringDbt(); + key1.setString( id[j] ); + StringDbt data1 = new StringDbt(); + try + { + table2.get( null,key1,data1,0 ); + title[j] = data1.getTitle(); + } + catch( Exception e ) + { + e.printStackTrace(); + title[j] = ""; + } + } + } + + _keyword.put( keyStr,info ); + } + catch( Exception e ) + { + e.printStackTrace(); + System.err.println( "any other exception in getKeyword: " + e.getMessage() ); + } + } + + return info; + } + +} // end class HelpDatabases + + + + --- xmlhelp/source/com/sun/star/help/makefile.mk 2004-05-03 22:12:36.000000000 +0200 +++ xmlhelp/source/com/sun/star/help/makefile.mk 2004-05-03 23:29:20.000000000 +0200 @@ -27,7 +27,39 @@ CLASSGENDIR = $(OUT)$/classgen RDB = $(SOLARBINDIR)$/types.rdb -JAVAFILES = $(subst,$(CLASSDIR)$/$(PACKAGE)$/, $(subst,.class,.java $(JAVACLASSFILES))) + +JAVAFILES = \ + HelpContentIdentifier.java \ + HelpProvider.java \ + HelpContent.java \ + HelpOutputStream.java \ + HelpURLStreamHandlerFactory.java \ + HelpURLStreamHandler.java \ + HelpURLStreamHandlerWithJars.java \ + HelpURLConnection.java \ + HelpURLConnectionWithJars.java \ + HelpURLParameter.java \ + HelpResultSetFactory.java \ + HelpDynamicResultSet.java \ + HelpResultSetBase.java \ + HelpResultSet.java \ + HelpResultSetForRoot.java \ + HelpTransformer.java \ + HelpPackager.java \ + XSLData.java \ + StringDbt.java + +.IF "$(DB_VERSION)" >= "4.1" +JAVAFILES += \ + db4$/HelpDatabases.java \ + db4$/CreateDb.java \ + db4$/HelpIndexer.java +.ELSE +JAVAFILES += \ + HelpDatabases.java \ + CreateDb.java \ + HelpIndexer.java +.ENDIF UNIXTEXT= \ $(MISC)$/helpserver.sh