Commit graph

30 commits

Author SHA1 Message Date
Dan Winship 622c360576 * parser/gapi2xml.pl (addFuncElems): if a struct or boxed type has
a constructor or a ref, unref, or destroy method, then it must be
	a reference type, so mark it "opaque" but then also mark all of
	its fields public and writable.

	* */*-api*.raw: Regen

	* generator/Parser.cs (ParseNamespace): make the opaque attribute
	check actually look at the value of the attribute rather than just
	checking if it's there, so that you can change a struct's opaque
	attribute from "true" to "false" via metadata and have that work.

	* generator/BoxedGen.cs (Generate): do not generate the boxed's
	"Free" method (since it's guaranteed to crash when we pass it a
	stack pointer). If "Copy" is marked deprecated, create a
	deprecated no-op for it, otherwise just skip it (since otherwise
	it will just leak memory when we copy its result onto the stack).

	* pango/Pango.metadata: deprecate Pango.Color.Copy and
	Pango.Matrix.Copy. Hide some array fields in Pango.GlyphString
	that we've never generated correctly. Tweak Pango.LayoutLine
	fields to be the same as they used to be.

	* pango/GlyphItem.custom (glyphs, item):
	* pango/GlyphString.custom (Zero, New):
	* pango/Item.custom (Zero, New):
	* pango/LayoutRun.custom (glyphs, item): add deprecated API compat

	* gdk/Gdk.metadata: undo the parser's new opaquification of
	Gdk.Font; it's been deprecated since pre-gtk# times, and no one
	should be using it, so there's no point in fixing it now. Fix up a
	few other things to match how they used to be. Fix RgbCmap's
	constructor args.

	* gdk/RgbCmap.custom (Zero, New): deprecated API compat

	* gdk/PangoAttrEmbossed.custom:
	* gdk/PangoAttrStipple.custom (Zero, New, Attr): deprecated API
	compat
	(explicit operator ...): allow casting back and forth between
	Pango.Attribute. (We can't usefully make them real subclasses of
	Pango.Attribute, because there's no way for
	Pango.Attribute.GetAttribute() to be able to dtrt with them.)

	* gtk/Gtk.metadata: deprecate Gtk.Requisition.Copy,
	Gtk.TextIter.Copy, and Gtk.TreeIter.Copy. Mark the return value of
	TextView.DefaultAttributes as "owned". Mark TargetList's fields
	private so it stays how it used to be.

	* gtk/TextAttributes.custom (Zero, New): deprecated API compat

	* gnomevfs/Gnomevfs.metadata: remove a bunch of opaque
	declarations that the parser figures out on its own now.

	* art/Art.metadata:
	* glade/Glade.metadata:
	* rsvg/Rsvg.metadata: un-mark everything the parser marked opaque
	in these libraries, because all of the structs in question would
	still be unusably broken, so the API churn would be pointless.

svn path=/trunk/gtk-sharp/; revision=48387
2005-08-15 15:15:57 +00:00
Mike Kestner e299e65c8a 2005-08-03 Mike Kestner <mkestner@novell.com>
* bootstrap : use gnome and vfs 2.10 api.
	* bootstrap-2.4 : use gnome and vfs 2.6 api.
	* bootstrap-for-the-insane : use gnome and vfs 2.10 api for now.
	* configure.in.in : substitute GNOME_REQUIRED_VERSION.
	* gnome/gnome-api.raw : rename to gnome-api-2.6.raw.
	* gnome/gnome-api-2.10.raw : new 2.10 parse.
	* gnomevfs/gnome-vfs-api.raw : rename to gnome-api-2.6.raw.
	* gnomevfs/gnome-vfs-api-2.10.raw : new 2.10 parse.
	* gnomevfs/Gnomevfs.metadata : mark MimeApplication opaque.
	* sources/Makefile.am : split gnome parse for 2.6/2.10.
	* sources/gtk-sharp-2.4-sources.xml : parse GNOME 2.6.
	* sources/gtk-sharp-2.6-sources.xml : parse GNOME 2.10.
	* sources/gtk-sharp-2.8-sources.xml : parse GNOME 2.10 for now.

svn path=/trunk/gtk-sharp/; revision=47981
2005-08-03 21:51:23 +00:00
Dan Winship eb4fdee774 Automatic memory management for opaque types [#49565]
* glib/Opaque.cs (Owned): new property saying whether or not gtk#
	owns the memory.
	(Opaque): Set Owned to true in the void ctor and false in the
	IntPtr one.
	(GetOpaque): add a new overload that can also create opaques, a la
	GLib.Object.GetObject.
	(Ref, Unref, Free): empty virtual methods to be overridden by
	subclasses.
	(set_Raw): Unref() and possibly Free() the old value, Ref() the
	new one.
	(~Opaque, Dispose): set Raw to IntPtr.Zero (triggering Free/Unref
	if needed)

	* parser/gapi2xml.pl (addReturnElem): if the method is named Copy
	and returns a pointer, set the "owned" attribute on the
	return-type.

	* */*-api.raw: Regen
	
	* generator/HandleBase.cs (FromNative): Add new
	FromNative/FromNativeReturn overloads that takes a "bool owned"
	param. Implement the 1-arg FromNative and FromNativeReturn in
	terms of that.

	* generator/ObjectBase.cs (FromNative): Implement HandleBase's new
	overload. Use the two-arg version of GLib.Object.GetObject when
	"owned" is true.

	* generator/OpaqueGen.cs (Generate): Pull out Ref, Unref, and
	Free/Destroy/Dispose methods and handle them specially by
	overriding Opaque.Ref, .Unref, and .Free appropriately. (If any
	of the methods are marked deprecated, output a deprecated
	do-nothing method as well, to save us from having to write all
	those deprecated methods by hand.)
	(FromNative): use GetOpaque, passing "owned".

	* generator/ReturnValue.cs (FromNative): if the value is a
	HandleBase, pass Owned to its FromNative().

	* generator/Parameters.cs (Owned): new property (for use on out
	params)
	(FromNative): Call FromNative() on the generatable, handling Owned
	in the case of HandleBase.

	* generator/ManagedCallString.cs:
	* generator/MethodBody.cs:
	* generator/Signal.cs: use param.FromNative() rather than
	param.Generatable.FromNative(), to get ownership right.

	* */*.metadata: Mark opaque ref/unref/free methods deprecated
	(except where we were hiding them before). Add "owned" attributes
	to return values and out params as needed.

	* pango/AttrIterator.custom (GetFont): work around a
	memory-management oddity of the underlying method.

	* pango/AttrFontDesc.cs (AttrFontDesc): copy the passed-in
	FontDescriptor, since the attribute will assume ownership of it.

	* gtk/TreeView.custom (GetPathAtPos): set the "owned" flag on the
	returned TreePaths.

	* gtk/TargetList.custom: Remove refcounting stuff, which is
	now handled automatically

	* gtk/NodeStore.cs (GetPath): clear the Owned flag on the created
	TreePath so that the underlying structure doesn't get freed when
	the function returns

	* gtkhtml/HTMLStream.custom (Destroy): hide this and then
	reimplement it by hand to keep OpaqueGen from using it in
	Dispose(), since calling it after an HTMLStream.Close() will
	result in a crash.

svn path=/trunk/gtk-sharp/; revision=47928
2005-08-02 18:45:21 +00:00
Dan Winship abcecb147f * sources/gtk-sharp-2.4-sources.xml:
* sources/gtk-sharp-2.6-sources.xml: remove some gnome-vfs files:
	gnome-vfs-method and gnome-vfs-transform, because they're
	internal/part of the module API, and gnome-vfs-file-size.h,
	because it's generated and shouldn't be in the source tarball (and
	we don't parse it right anyway).

	* gnomevfs/gnome-vfs-api.raw: Regen

	* gnomevfs/gnomevfs-symbols.xml: add GnomeVFSFileOffset

	* gnomevfs/Gnomevfs.metadata: remove a whole bunch of callback
	types that are only used from methods and structs that we hide.

svn path=/trunk/gtk-sharp/; revision=47268
2005-07-13 15:08:08 +00:00
Mike Kestner eddfdc7910 2005-06-23 Mike Kestner <mkestner@novell.com>
* generator/ReturnValue.cs : support owned and elements_owned for lists.
	* glib/List.cs : add ctor overloads for memory mgmt.
	* glib/ListBase.cs : add ctor overloads for memory mgmt. Dispose
	elements if specified.
	* glib/SList.cs : add ctor overloads for memory mgmt.
	* gnome/Gnome.metadata : unhide and generate a List prop.
	* gnomevfs/Gnomevfs.metadata : unhide and generate a List prop.
	* gtk/FileChooser.custom : new. add hidden props.
	* gtk/FileChooserButton.custom : new. impl hidden props.
	* gtk/FileChooserDialog.custom : remove some List props and use the
	GLib.Marshaller for the remaining ones..
	* gtk/FileChooserWidget.custom : remove some List props and use the
	GLib.Marshaller for the remaining ones..
	* gtk/Gtk.metadata : unhide and let the generator do some List props.

svn path=/trunk/gtk-sharp/; revision=46457
2005-06-23 22:28:06 +00:00
Mike Kestner 463618c958 2005-06-08 Mike Kestner <mkestner@novell.com>
* generator/SimpleBase.cs : off-by-one in namespace join.
	* glib/ListBase.cs : support IntPtr element_type.
	* gnomevfs/FileInfo.cs : make it ManualGen friendly.
	* gnomevfs/*.cs : rework for FileInfo api changes.
	* gnomevfs/Gnomevfs.metadata : make FileInfo a manual symbol.
	* gnomevfs/Uri.custom : rework for FileInfo api changes.
	* gnome/Makefile.am : add gnomevfs dependency to pick up some more api
	symbols.
	* gnome/gnome-sharp-2.0.pc.in : advertise the vfs dep.
	[Fixes #71060]

svn path=/trunk/gtk-sharp/; revision=45702
2005-06-09 14:27:48 +00:00
Mike Kestner a307c78232 2005-06-08 Mike Kestner <mkestner@novell.com>
* generator/ReturnValue.cs : improved list to array marshaling.
	* glib/Marshaller.cs : added ListToArray ().
	* gnomevfs/Gnomevfs.metadata : mark element_type on
	Mime.GetAllApplications. [Fixes #71888]

svn path=/trunk/gtk-sharp/; revision=45649
2005-06-08 16:53:12 +00:00
Mike Kestner abaf1ce343 2005-06-06 Mike Kestner <mkestner@novell.com>
* generator/ImportSignature.cs : fix native delegate namespacing hack.
	* gnomevfs/gnome-vfs-api.raw : regen.
	* gnomevfs/Gnomevfs.metadata : replace all the type renames with a
	namespace rename.  remove-node several manually implemented callback
	types and broken generated types for now.
	* gnomevfs/Async.cs : use Opaque.Handle.
	* gnomevfs/Handle.cs : kill. replaced by generated GLib.Opaque type.
	* gnomevfs/Makefile.am : kill Handle.cs.
	* gnomevfs/Sync.cs : use Opaque.Handle.
	* sources/gtk-sharp-2.6-sources.xml : s/Gnome.Vfs/GnomeVFS.

svn path=/trunk/gtk-sharp/; revision=45507
2005-06-06 17:16:04 +00:00
Mike Kestner e56d2feafc kill useless .cvsignore files
svn path=/trunk/gtk-sharp/; revision=43355
2005-04-20 20:11:00 +00:00
Mike Kestner d8ecc52b5e 2005-03-09 Mike Kestner <mkestner@novell.com>
* */*.custom : scrub for string usage in DllImports.
	* gnome/Makefile.am : remove IconTheme.custom, it's not generated.

svn path=/trunk/gtk-sharp/; revision=41615
2005-03-09 20:32:24 +00:00
Mike Kestner 90a870e2de 2005-03-08 Mike Kestner <mkestner@novell.com>
* */*.cs : scrub for StringToPtrAnsi and string usage in DllImports.
	* */*.custom : begin the scrub here too.
	* generator/ConstStringGen.cs : implement IManualMarshaler and move to
	100% IntPtr marshaling.
	* generator/Ctor.cs : call Body.Finish too.
	* generator/IManualMarshaler.cs : new interface for generatables that
	marshal manually and need cleanup.
	* generator/Makefile.am : new file.
	* generator/MethodBody.cs : use IManualMarshaler if applicable.

svn path=/trunk/gtk-sharp/; revision=41579
2005-03-08 21:28:08 +00:00
Dan Winship eb4269562f * generator/Field.cs (Validate): new, to check that a field has a
valid type (or is hidden).

	* generator/StructBase.cs (Validate): new, to check that all of
	the struct fields have valid types

	* generator/BoxedGen.cs (Generate):
	* generator/StructGen.cs: (Generate): Call Validate() and bail out
	if it fails; it's no good to generate a struct with the wrong
	layout.

	* gdk/gdk-symbols.xml: add a line for GdkKey -> Gdk.Key. (There's
	no actual C type GdkKey, but we can use metadata to change uints
	to GdkKeys, which will then become Gdk.Keys.)

	* gtk/AccelKey.custom: remove the "Key" field (which was being
	added in the wrong place in the struct), since it's properly
	generated now.

	* gtk/Gtk.metadata: Fix the line that renames AccelKey.AccelKey
	to AccelKey.Key

	* gnomevfs/Gnomevfs.metadata: hide the (mis-parsed) "action" field
	in MimeAction, leaving the struct in the same broken state it was
	in with the old generator code

svn path=/trunk/gtk-sharp/; revision=41104
2005-02-23 17:37:33 +00:00
Mike Kestner 8fd87b2e0a 2005-01-08 Mike Kestner <mkestner@novell.com>
* configure.in : kill a ton of redundant stuff.
	* AssemblyInfo.cs.in : moved here, only need one.
	* Makefile.include : rules for building generated assemblies.
	* Makefile.am : removed gtk-sharp-2.0.pc handling.
	* */AssemblyInfo.cs.in : killed
	* */Makefile.am : refactored out a ton of rules to an include.
	* */*-pc.in : added Cflags entries pointing to the gapi files.
	* generator/CodeGenerator.cs : add -I: synonym --include.
	* gnomevfs/gnome-vfs-api.raw : remamed from gnomevfs-api.raw.
	* gtk/gtk-sharp-2.0.pc.in : moved here from top.
	* parser/gapi-fixup.cs : add --symbol arg to merge sym files.
	* sources/gtk-sharp-sources.xml : remamed gnome-vfs-api.raw.

svn path=/trunk/gtk-sharp/; revision=38551
2005-01-09 00:26:45 +00:00
Mike Kestner e068a811e3 2005-01-06 Mike Kestner <mkestner@novell.com>
* gnomevfs/gnomevfs-symbols.xml : FileSize is a long long.
	* generator/SymbolTable.cs : map longlong to C# long.

svn path=/trunk/gtk-sharp/; revision=38434
2005-01-06 16:10:35 +00:00
Jeroen Zwartepoorte a1755d7914 2004-12-28 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/Gnomevfs.metadata: Hide some more API.
	* gnomevfs/VfsStreamAsyncResult.cs: Make Done property internal.
	* gnomevfs/VolumeMonitor.custom: Hide GList API.


svn path=/trunk/gtk-sharp/; revision=38130
2004-12-28 14:12:35 +00:00
Jeroen Zwartepoorte fa60ba6839 2004-12-28 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/Directory.cs: PInvoke the _uri methods directory instead of
	using the ToString() methods.
	* gnomevfs/FileInfo.cs: Make the FileInfoNative field internal.
	* gnomevfs/Gnomevfs.metadata: Hide a bunch of unwanted API.
	* gnomevfs/Uri.custom: New API.
	* gnomevfs/Vfs.cs: Idem.


svn path=/trunk/gtk-sharp/; revision=38126
2004-12-28 09:14:15 +00:00
Jeroen Zwartepoorte f3b891e758 2004-12-27 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/Directory.cs: s/uint/FilePermissions/.
	* gnomevfs/Gnomevfs.metadata: Make a bunch of API more user-friendly &
	C# like.
	* gnomevfs/Monitor.cs: Add internal MonitorEventType enum.
	* gnomevfs/Uri.custom: Move a bunch of API from Vfs.cs to Uri.
	* gnomevfs/Vfs.cs: Only put initialize & shutdown methods in here (plus
	some debug API).
	* gnomevfs/VfsStream.cs: Use new Uri API.
	* sample/gnomevfs/TestUnlink.cs: Fix sample.


svn path=/trunk/gtk-sharp/; revision=38112
2004-12-27 20:02:33 +00:00
Jeroen Zwartepoorte 2d8853461e 2004-12-21 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/Async.cs:
	* gnomevfs/Directory.cs:
	* gnomevfs/Sync.cs:
	* gnomevfs/Vfs.cs: Make the constructors private so they don't show up
	in monodoc (these classes aren't meant to be instantiated).


svn path=/trunk/gtk-sharp/; revision=38025
2004-12-21 12:52:49 +00:00
Jeroen Zwartepoorte bdf07d6a55 2004-12-21 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/Gnomevfs.metadata: Hide the auto-generated ModuleCallback
	stuff in favor of the more developer friendly custom bindings.
	* gnomevfs/Makefile.am:
	* gnomevfs/ModuleCallbackAuthentication.cs:
	* gnomevfs/ModuleCallbackFillAuthentication.cs:
	* gnomevfs/ModuleCallbackFullAuthentication.cs:
	* gnomevfs/ModuleCallbackSaveAuthentication.cs:
	* gnomevfs/ModuleCallbackStatusMessage.cs: Complete the module callback
	implementations.


svn path=/trunk/gtk-sharp/; revision=38022
2004-12-21 09:18:44 +00:00
Jeroen Zwartepoorte e2fd0d5e42 2004-12-20 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/Makefile.am:
	* gnomevfs/ModuleCallback.cs: 
	* gnomevfs/ModuleCallbackAuthentication.cs:
	* gnomevfs/ModuleCallbackFullAuthentication.cs:
	* gnomevfs/Vfs.cs: Use a custom VfsException for Result errors.
	* gnomevfs/VfsException.cs: new custom Exception class.
	* sample/gnomevfs/Makefile.am:
	* sample/gnomevfs/TestCallback.cs:
	
	Implement custom bindings for the ModuleCallback mechanism. Atm, only
	the GNOME_VFS_MODULE_CALLBACK_AUTHENTICATION and
	GNOME_VFS_MODULE_CALLBACK_FULL_AUTHENTICATION callbacks are implemented.
	Also added a test-case using the full authentication callback (tested
	using the sftp: method). [Partially fixes #70602]


svn path=/trunk/gtk-sharp/; revision=37972
2004-12-20 15:20:58 +00:00
Dan Winship 88cc4817f5 * parser/gapi_pp.pl: Don't strip out /*< public >*/ and
/*< private >*/ comments.

        * parser/gapi2xml.pl: Use those comments to determine the
        accessibility of struct/object fields, and set the "access"
        attribute on fields with non-default accessibiliy (private for
        structs, public for objects). Also, output a StudlyName for each
        field as well as a c_name.

        * */*-api.raw: Regen

        * generator/Field.cs (StudlyName): Use the parser-generated studly
        name rather than studlifying Name, which might have been mangled
        to avoid conflicts with an all-lowercase keyword.
        (Generate): Respect the access property on all field types rather
        than always making certain types public. Don't bother outputting
        wrapper properties for private fields, since the only code that
        could use them is the generated code, which won't.

        See doc/ChangeLog for the (very minimal) fallout from these
        changes.

        * en/Art/AlphaGamma.xml:
        * en/Gtk/TextAttributes.xml (Refcount):
        * en/Pango/GlyphString.xml (Space): these are now private

        * en/Gda/XqlItem.xml:
        * en/Glade/SignalInfo.xml:
        * en/Gnome.Vfs/ModuleCallbackSaveAuthenticationIn.xml: 
        * en/Gnome.Vfs/ModuleCallbackFullAuthenticationIn.xml: 
        * en/Gnome.Vfs/ModuleCallbackFillAuthenticationIn.xml: rename
        Objekt to Object.

        * en/Atk/KeyEventStruct.xml: rename Str1ng to String

svn path=/trunk/gtk-sharp/; revision=37853
2004-12-16 23:22:07 +00:00
Mike Kestner cd10436742 2004-11-09 Mike Kestner <mkestner@novell.com>
* */Makefile.am : make the Obsolete warnings shaddup.

svn path=/trunk/gtk-sharp/; revision=35999
2004-11-11 03:58:14 +00:00
Mike Kestner 37fc7b8f19 2004-11-09 Mike Kestner <mkestner@novell.com>
* configure.in : conditional stuff for gnomevfs
	* doc/Makefile.am : conditionally update panelapplet and gnomevfs.
	* doc/en/*/* : update to add PanelApplet and Gnome.Vfs stubs.
	* gnomevfs/Makefile.am : make conditional

svn path=/trunk/gtk-sharp/; revision=35905
2004-11-09 18:36:27 +00:00
Jeroen Zwartepoorte 3c8715f2e8 2004-11-05 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/*.cs: Add copyright/LGPL header.
	* gnomevfs/*.custom: Idem.
	* gnomevfs/Mime.cs: Obsolete, replaced by MimeType.cs.
	* gnomevfs/MimeActionType.cs: Obsolete, generated now.
	* gnomevfs/OpenMode.cs: Idem.
	* gnomevfs/Result.cs: Idem.
	* gnomevfs/SeekPosition.cs: Idem.

svn path=/trunk/gtk-sharp/; revision=35707
2004-11-05 17:40:03 +00:00
Jeroen Zwartepoorte fa86814e94 2004-11-04 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/Directory.cs: Add async GetEntries Uri alias.
	* gtk/FileChooserDialog.custom: Add nice custom properties for Uris.
	ListFilters, ListShortcutFolders and ListShortcutFolderUris.
	* gtk/FileChooserWidget.custom: Idem.
	* gtk/Gtk.metadata: Idem.

svn path=/trunk/gtk-sharp/; revision=35669
2004-11-04 20:33:35 +00:00
Jeroen Zwartepoorte 55aed28266 2004-11-02 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/AsyncDirectoryLoadCallback.cs:
	* gnomevfs/AsyncDirectoryLoadCallbackNative.cs:
	* gnomevfs/Directory.cs: Implement asynchronous directory loading.
	* gnomevfs/FileInfo.cs: Clear the FileInfoNative struct in the
	destructor.
	* gnomevfs/Makefile.am: Add new callback files.
	* sample/gnomevfs/TestDirectory.cs: Add async test.

svn path=/trunk/gtk-sharp/; revision=35571
2004-11-02 19:17:05 +00:00
Jeroen Zwartepoorte c551f4c479 2004-11-01 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/Directory.cs: New Create and Delete methods. Free the
	FileInfo List returned by gnome_vfs_directory_list_load.
	* gnomevfs/FileInfo.cs: Copy the FileInfoNative struct so the original
	can be properly freed.
	* gnomevfs/Vfs.cs: Move MakeDirectory and RemoveDirectory to Directory.

svn path=/trunk/gtk-sharp/; revision=35535
2004-11-01 21:00:09 +00:00
Jeroen Zwartepoorte cdfc01223a Committed too much. Part of the commit wasn't supposed to happen (yet). Revert.
svn path=/trunk/gtk-sharp/; revision=35533
2004-11-01 20:38:00 +00:00
Jeroen Zwartepoorte 33dbe7485e 2004-11-01 Jeroen Zwartepoorte <jeroen@xs4all.nl>
* gnomevfs/Directory.cs: Bind gnome_vfs_directory_list_load as a static
	FileInfo[] GetEntries (uri) method.
	* gnomevfs/FileInfo.cs: Add internal FileInfoNative constructor to
	create a FileInfo class based on an existing FileInfoNative struct.
	* gnomevfs/Makefile.am:
	* sample/gnomevfs/Makefile.am:
	* sample/gnomevfs/TestDirectory.cs:

svn path=/trunk/gtk-sharp/; revision=35532
2004-11-01 20:03:30 +00:00
Mike Kestner 7f3171c814 merge to HEAD of jeroen and friends' work on the 2-4 branch. HEAD
is now tracking Gnome 2.6.

svn path=/trunk/gtk-sharp/; revision=35479
2004-10-29 20:33:07 +00:00