diff --git a/ChangeLog b/ChangeLog index 2e963ad6e..fe8076d95 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2004-01-29 Mike Kestner + + * glib/time_t_CustomMarshaler.cs : new custom marshaler form time_t. + * glue/time_t.c : glue for time_t. + * glue/Makefile.am : add time_t.c + * glue/makefile.win32 : ditto + 2004-01-28 John Luke * glade/XML.custom : some null checking for crash prevention. diff --git a/glib/time_t_CustomMarshaler.cs b/glib/time_t_CustomMarshaler.cs new file mode 100644 index 000000000..3128ef504 --- /dev/null +++ b/glib/time_t_CustomMarshaler.cs @@ -0,0 +1,70 @@ +// time_t_CustomMarshaler.cs - Custom marshaling between time_t and DateTime +// +// Author: Mike Kestner +// +// Copyright (c) 2004 Novell, Inc. + +namespace GLib { + + using System; + using System.Runtime.InteropServices; + + public class time_t_CustomMarshaler : ICustomMarshaler { + + static time_t_CustomMarshaler marshaler; + int utc_offset; + DateTime local_epoch; + + private time_t_CustomMarshaler () + { + utc_offset = DateTime.Now.Subtract (DateTime.UtcNow).Seconds; + local_epoch = new DateTime (1970, 1, 1, 0, 0, 0); + } + + public static ICustomMarshaler GetInstance (string cookie) + { + if (marshaler == null) + marshaler = new time_t_CustomMarshaler (); + + return marshaler; + } + + [DllImport ("gtksharpglue")] + static extern int gtksharp_time_t_sizeof (); + + [DllImport ("gtksharpglue")] + static extern void gtksharp_time_t_print (int time_t); + + public IntPtr MarshalManagedToNative (object obj) + { + DateTime dt = (DateTime) obj; + int size = Marshal.SizeOf (typeof (int)) + gtksharp_time_t_sizeof (); + IntPtr ptr = Marshal.AllocCoTaskMem (size); + IntPtr time_t_ptr = new IntPtr (ptr.ToInt32 () + Marshal.SizeOf (typeof(int))); + + int secs = dt.Subtract (local_epoch).Seconds + utc_offset; + Console.WriteLine ("Marshaling DateTime: " + dt); + Marshal.WriteInt32 (time_t_ptr, secs); + gtksharp_time_t_print (secs); + return time_t_ptr; + } + + public void CleanUpNativeData (IntPtr data) + { + IntPtr ptr = new IntPtr (data.ToInt32 () - Marshal.SizeOf (typeof (int))); + Marshal.FreeCoTaskMem (ptr); + } + + public object MarshalNativeToManaged (IntPtr data) + { + throw new NotImplementedException (); + } + + public void CleanUpManagedData (object obj) {} + + public int GetNativeDataSize () + { + throw new NotImplementedException (); + } + } +} diff --git a/glue/Makefile.am b/glue/Makefile.am index 8d1d3919b..d9ba2fa93 100644 --- a/glue/Makefile.am +++ b/glue/Makefile.am @@ -20,6 +20,7 @@ BASESOURCES = \ selectiondata.c \ slist.c \ style.c \ + time_t.c \ type.c \ value.c \ valuearray.c \ diff --git a/glue/makefile.win32 b/glue/makefile.win32 index 81aad3219..9550fe028 100755 --- a/glue/makefile.win32 +++ b/glue/makefile.win32 @@ -22,6 +22,7 @@ GLUE_OBJS = \ selectiondata.o \ slist.o \ style.o \ + time_t.o \ type.o \ value.o \ valuearray.o \ diff --git a/glue/time_t.c b/glue/time_t.c new file mode 100644 index 000000000..bf0a85709 --- /dev/null +++ b/glue/time_t.c @@ -0,0 +1,26 @@ +/* time_t.c : Glue to allocate time_t. + * + * Author: Mike Kestner + * + * Copyright 2004 Novell, Inc. + */ + +#include +#include +#include + +/* Forward declarations */ +gint gtksharp_time_t_sizeof (void); +void gtksharp_time_t_print (time_t t); + +gint +gtksharp_time_t_sizeof () +{ + return sizeof (time_t); +} + +void +gtksharp_time_t_print (time_t t) +{ + printf ("%s\n", ctime (&t)); +}