Blob Blame History Raw
=== modified file 'Makefile.am'
--- Makefile.am	2007-10-04 23:12:37 +0000
+++ Makefile.am	2010-03-30 04:39:13 +0000
@@ -1,3 +1,2 @@
-SUBDIRS=src docs sample
+SUBDIRS=src gnome-keyring-sharp-glue docs sample
 EXTRA_DIST=Gnome.Keyring.snk
-

=== added directory 'Tests'
=== added file 'Tests/TestRing.cs'
--- Tests/TestRing.cs	1970-01-01 00:00:00 +0000
+++ Tests/TestRing.cs	2010-03-30 03:00:47 +0000
@@ -0,0 +1,415 @@
+// 
+// TestRing.cs
+//  
+// Author:
+//       Christopher James Halse Rogers <<christopher.halse.rogers@canonical.com>>
+// 
+// Copyright (c) 2010 Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Gnome.Keyring
+{
+	public static class TestHelpers
+	{
+		public static void NotContains<T> (T toFind, ICollection<T> collection)
+		{
+			Assert.That (collection, new NotConstraint (new ContainsConstraint (toFind)));
+		}
+	}
+	
+	[TestFixture()]
+	public class TestRing
+	{
+		[SetUp()]
+		public void SetUp ()
+		{
+			try {
+				Ring.CreateKeyring ("keyring1", "password");
+			} catch (KeyringException e) {
+				if (e.ResultCode != ResultCode.AlreadyExists) {
+					throw;
+				}
+			}
+			Ring.SetDefaultKeyring ("keyring1");
+		}
+		
+		[TearDown()]
+		public void TearDown ()
+		{
+			try {
+				Ring.DeleteKeyring ("keyring1");
+				Ring.SetDefaultKeyring ("login");
+			} catch {
+				// I don't care.
+			}
+			GC.Collect ();
+		}
+		
+		[Test()]
+		public void GetDefaultKeyringNameReturnsLogin ()
+		{
+			Assert.AreEqual ("keyring1", Ring.GetDefaultKeyring ());
+		}
+		
+		[Test()]
+		public void GetKeyringsListsAllKeyrings ()
+		{
+			Assert.Contains ("keyring1", Ring.GetKeyrings ());
+		}
+		
+		[Test()]
+		public void KeyringIsAvailable ()
+		{
+			Assert.IsTrue (Ring.Available);
+		}
+		
+		[Test()]
+		public void SetDefaultKeyringUpdatesGetDefaultKeyring ()
+		{
+			string prevDefault = Ring.GetDefaultKeyring ();
+			Ring.CreateKeyring ("test1", "password");
+			try {
+				Ring.SetDefaultKeyring ("test1");
+				Assert.AreEqual ("test1", Ring.GetDefaultKeyring ());
+			} finally {
+				Ring.DeleteKeyring ("test1");
+				Ring.SetDefaultKeyring (prevDefault);
+			}
+		}
+		
+		[Test()]
+		[ExpectedException (ExpectedMessage = "No such keyring", ExceptionType = typeof (KeyringException))]
+		public void SetDefaultKeyringWithInvalidKeyringRaisesException ()
+		{
+			Ring.SetDefaultKeyring ("Keyring That Doesn't Exist");
+		}
+		
+		[Test()]
+		public void CreatedKeyringAppearsInKeyringList ()
+		{
+			Ring.ApplicationName = "Tests";
+			string keyringName = "atestkeyring";
+			Ring.CreateKeyring (keyringName, "password");
+			Assert.Contains (keyringName, Ring.GetKeyrings ());
+			Ring.DeleteKeyring (keyringName);
+		}
+		
+		[Test()]
+		[ExpectedException (ExpectedMessage = "Item already exists", ExceptionType = typeof (KeyringException))]
+		public void CreatingTheSameKeyringTwiceRaisesException ()
+		{
+			string keyringName = "anothertestkeyring";
+			Ring.CreateKeyring (keyringName, "password");
+			try {
+				Ring.CreateKeyring (keyringName, "password");
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void RemovingKeyringRemovesItFromKeyringList ()
+		{
+			string keyringName = "akeyring";
+			Ring.CreateKeyring (keyringName, "password");
+			Assert.Contains (keyringName, Ring.GetKeyrings ());
+			Ring.DeleteKeyring (keyringName);
+			TestHelpers.NotContains (keyringName, Ring.GetKeyrings ());
+		}
+		
+		[Test()]
+		public void GetKeyringInfoGetsCorrectName ()
+		{
+			string keyringName = "login";
+			KeyringInfo info = Ring.GetKeyringInfo (keyringName);
+			Assert.AreEqual (keyringName, info.Name);
+		}
+		
+		[Test()]
+		[Ignore ("Setting keyring properties is broken in libgnome-keyring.  Apparently no one uses this.")]
+		public void SetKeyringInfoUpdatesLockTimeout ()
+		{
+			string keyringName = "testkeyring";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			try {
+				KeyringInfo info = Ring.GetKeyringInfo (keyringName);
+				info.LockTimeoutSeconds++;
+				Assert.AreNotEqual (info.LockTimeoutSeconds, Ring.GetKeyringInfo (keyringName).LockTimeoutSeconds);
+				
+				Ring.Unlock (keyringName, null);
+				Ring.SetKeyringInfo (keyringName, info);
+				Assert.AreEqual (info.LockTimeoutSeconds, Ring.GetKeyringInfo (keyringName).LockTimeoutSeconds);
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		[Ignore ("Setting keyring properties is broken in libgnome-keyring.  Apparently no one uses this.")]
+		public void SetKeyringLockOnIdleUpdatesInfo ()
+		{
+			string keyringName = "theamazingtestkeyring";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			try {
+				KeyringInfo info = Ring.GetKeyringInfo (keyringName);
+				info.LockOnIdle = !info.LockOnIdle;
+				Assert.AreNotEqual (info.LockOnIdle, Ring.GetKeyringInfo (keyringName).LockOnIdle);
+				
+				Ring.SetKeyringInfo (keyringName, info);
+				Assert.AreEqual (info.LockOnIdle, Ring.GetKeyringInfo (keyringName).LockOnIdle);
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void TestIdListForLoginKeyringIsNonEmpty ()
+		{
+			Assert.IsNotEmpty (Ring.ListItemIDs ("login"));
+		}
+		
+		[Test()]
+		public void TestIdListContainsSaneIds ()
+		{
+			foreach (int i in Ring.ListItemIDs ("login")) {
+				Assert.GreaterOrEqual (i, 0);
+			}
+			CollectionAssert.AllItemsAreUnique (Ring.ListItemIDs ("login"));
+		}
+		
+		[Test()]
+		public void CreatedItemIdExistsInIdList ()
+		{
+			string keyringName = "testifu";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			Hashtable attributes = new Hashtable ();
+			attributes["name"] = "woot";
+			attributes["banana"] = "some other value";
+			attributes["eggplant"] = "aubergine";
+			attributes["apple"] = 25;
+			
+			try {
+				int id = Ring.CreateItem (keyringName, ItemType.Note, "Random note", attributes, "reallysecret", false);
+				CollectionAssert.Contains (Ring.ListItemIDs (keyringName), id);
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		/*
+		 * It seems that there's no way to stop gnome-keyring-daemon from prompting the user to unlock.
+		 * So we won't get an AccessDenied exception here; we'll block until the user has dealt with the unlock dialog.
+		 */
+		[Test()]
+		[Ignore ("Requires user interaction")]
+		public void AccessingALockedKeyringPromptsToUnlock ()
+		{
+			string keyringName = "akeyring";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			try {
+				Ring.Lock (keyringName);
+				Ring.CreateItem (keyringName, ItemType.Note, "Random note", new Hashtable (), "reallysecret", false);
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void DeletingItemRemovesItFromIdList ()
+		{
+			string keyringName = "keyring";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			try {
+				int id = Ring.CreateItem (keyringName, ItemType.Note, "test data", new Hashtable (), "secret", false);
+				CollectionAssert.Contains (Ring.ListItemIDs (keyringName), id);
+				Ring.DeleteItem (keyringName, id);
+				CollectionAssert.DoesNotContain (Ring.ListItemIDs (keyringName), id);
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void DataOfAddedItemPersists ()
+		{
+			string keyringName = "keyring";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			try {
+				int id = Ring.CreateItem (keyringName, ItemType.Note, "test data", new Hashtable (), "secret", false);
+				
+				ItemData item = Ring.GetItemInfo (keyringName, id);
+				Assert.AreEqual ("test data", (string)item.Attributes["name"]);
+				Assert.AreEqual ("secret", item.Secret);
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void SetItemDataPersists ()
+		{
+			string keyringName = "keyring";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			try {
+				int id = Ring.CreateItem (keyringName, ItemType.Note, "test", new Hashtable (), "secret", false);
+				
+				Ring.SetItemInfo (keyringName, id, ItemType.GenericSecret, "newdisplayname", "newsecret");
+				ItemData item = Ring.GetItemInfo (keyringName, id);
+				Assert.AreEqual ("newdisplayname", (string)item.Attributes["name"]);
+				Assert.AreEqual ("newsecret", item.Secret);
+				Assert.AreEqual (ItemType.GenericSecret, item.Type);
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void GetItemAttributesReturnsCreatedValues ()
+		{
+			string keyringName = "keyring";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			try {
+				Hashtable attributes = new Hashtable ();
+				attributes["stringAttr"] = "astring";
+				attributes["uintAttr"] = 42;
+				int id = Ring.CreateItem (keyringName, ItemType.Note, "test", attributes, "secret", false);
+				
+				CollectionAssert.IsSubsetOf (attributes, Ring.GetItemAttributes (keyringName, id));
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void SetItemAttributesPersists ()
+		{
+			string keyringName = "keyring";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			try {
+				int id = Ring.CreateItem (keyringName, ItemType.Note, "test", new Hashtable (), "secret", false);
+
+				Hashtable attributes = new Hashtable ();
+				attributes["stringAttr"] = "astring";
+				attributes["meaning"] = 42;
+				attributes["UTF8"] = "♪ “The sun is a mass of incandescent gas” ♫";
+				
+				Ring.SetItemAttributes (keyringName, id, attributes);
+				
+				CollectionAssert.IsSubsetOf (attributes, Ring.GetItemAttributes (keyringName, id));
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void CreatedNetworkPasswordSetsAppropriateData ()
+		{
+			string keyringName = "keyring";
+			Ring.CreateKeyring (keyringName, "password");
+			
+			try {
+				Hashtable data = new Hashtable ();
+				data["user"] = "raof";
+				data["domain"] = "divination";
+				data["server"] = "jeeves";
+				data["object"] = "subject";
+				data["protocol"] = "droid";
+				data["authtype"] = "smtp";
+				data["port"] = 42;
+				
+				//Password is stored in the secret.
+				int id = Ring.CreateOrModifyNetworkPassword (keyringName, (string)data["user"], (string)data["domain"], (string)data["server"],
+					(string)data["object"], (string)data["protocol"], (string)data["authtype"], (int)data["port"], "password");
+				
+				CollectionAssert.IsSubsetOf (data, Ring.GetItemAttributes (keyringName, id));
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void FindNetworkPasswordByDomainFindsAppropriateIDs ()
+		{
+			string keyringName = "keyring";
+			Ring.CreateKeyring (keyringName, "password");
+			List<int> ids = new List<int> ();
+			
+			try {
+				ids.Add (Ring.CreateOrModifyNetworkPassword (keyringName, "user", "domain", "server", "object", "protocol", "authtype", 42, "password"));
+				Ring.CreateOrModifyNetworkPassword (keyringName, "user2", "d3omain", "4server", "o5bject", "proto6col", "3authtype", 49, "password");
+				Ring.CreateItem (keyringName, ItemType.Note, "I'm not a network password", new Hashtable (), "secret", false);
+				ids.Add (Ring.CreateOrModifyNetworkPassword (keyringName, "u3ser", "domain", "server", "object", "protocol", "authtype", 42, "password"));
+				ids.Add (Ring.CreateOrModifyNetworkPassword (keyringName, "use4r", "domain", "server", "object", "protocol", "authtype", 42, "password"));
+
+				CollectionAssert.AreEquivalent (ids, Ring.FindNetworkPassword (null, "domain", null, null, null, null, 0).
+					Where ((NetItemData data) => data.Keyring == keyringName).
+					Select ((NetItemData data) => data.ItemID).ToList ());
+			} finally {
+				Ring.DeleteKeyring (keyringName);
+			}
+		}
+		
+		[Test()]
+		public void FindItemByAttributeOnlyFindsMatchingIDs ()
+		{
+			string keyringName = "keyring1";
+			
+			List<int> correct_ids = new List<int> ();
+			List<int> incorrect_ids = new List<int> ();
+			
+			Hashtable correctAttr = new Hashtable ();
+			correctAttr["banana"] = "a fruit";
+			Hashtable incorrectAttr = new Hashtable ();
+			incorrectAttr["banana"] = "a fish";
+			
+			correct_ids.Add (Ring.CreateItem (keyringName, ItemType.Note, "a note", correctAttr, "secret", false));
+			incorrect_ids.Add (Ring.CreateItem (keyringName, ItemType.GenericSecret, "not a note", incorrectAttr, "secret", false));
+			correct_ids.Add (Ring.CreateItem (keyringName, ItemType.Note, "another note", correctAttr, "notsecret", false));
+			correct_ids.Add (Ring.CreateItem (keyringName, ItemType.Note, "a third note", correctAttr, "reallysecret", false));
+			incorrect_ids.Add (Ring.CreateOrModifyNetworkPassword (keyringName, "use4r", "domain", "server", "object", "protocol", "authtype", 42, "password"));
+
+			CollectionAssert.IsSubsetOf (Ring.Find (ItemType.Note, correctAttr).
+				Where ((data) => data.Keyring == keyringName).
+				Select ((data) => data.ItemID).ToList (), correct_ids);
+			foreach (var id in incorrect_ids) {
+				CollectionAssert.DoesNotContain (Ring.Find (ItemType.Note, correctAttr).
+					Where ((data) => data.Keyring == keyringName).
+					Select ((data) => data.ItemID), id);
+			}
+		}
+	}
+}

=== modified file 'autogen.sh'
--- autogen.sh	2006-08-01 19:08:46 +0000
+++ autogen.sh	2010-03-30 05:11:57 +0000
@@ -1,4 +1,2 @@
-aclocal
-automake -a
-autoconf
+autoreconf -v -i -s
 ./configure $*

=== modified file 'configure.ac'
--- configure.ac	2009-05-07 15:32:19 +0000
+++ configure.ac	2010-03-30 04:43:32 +0000
@@ -3,6 +3,9 @@
 AC_INIT(src/Gnome.Keyring/Ring.cs)
 AC_CANONICAL_SYSTEM
 
+AC_PROG_CC
+AC_PROG_LIBTOOL
+
 API_VERSION=1.0
 VERSION=$API_VERSION.1
 
@@ -47,27 +50,14 @@
 GACUTIL_FLAGS='/gacdir $(DESTDIR)$(prefix)'
 AC_SUBST(GACUTIL_FLAGS)
 
-#
-# Use D-Bus as a fallback to get the keyring socket address
-#
-AC_ARG_ENABLE(dbus, 
-	      [AC_HELP_STRING([--enable-dbus],[compile with D-Bus support default: yes])],
-	      ENABLE_DBUS="$enableval")
-AM_CONDITIONAL(ENABLE_DBUS, test "x$ENABLE_DBUS" != "xno")
-
-CSFLAGS=
-DBUS_LIBS=
-if test "x$ENABLE_DBUS" != "xno" ; then
-	PKG_CHECK_MODULES(DBUS, ndesk-dbus-1.0 >= 0.4, HAVE_DBUS="yes", HAVE_DBUS="no")
-
-	if test "x$HAVE_DBUS" = "xno"; then
-	  AC_MSG_ERROR($DBUS_PKG_ERRORS: consider passing --enable-dbus=no to configure)
-	fi
-
-	CSFLAGS=" -d:WITH_DBUS "
-fi
+
+PKG_CHECK_MODULES(GLIB_SHARP, [glib-sharp-2.0])
+PKG_CHECK_MODULES(GNOME_KEYRING, [gnome-keyring-1])
+
 AC_SUBST(CSFLAGS)
-AC_SUBST(DBUS_LIBS)
+AC_SUBST(GLIB_SHARP_LIBS)
+AC_SUBST(GNOME_KEYRING_CFLAGS)
+AC_SUBST(GNOME_KEYRING_LIBS)
 
 AC_ARG_ENABLE(monodoc, 
 	      [AC_HELP_STRING([--enable-monodoc],[install monodoc documents default: yes])],
@@ -101,6 +91,7 @@
 	src/gnome-keyring-sharp-1.0.pc
 	src/Gnome.Keyring/Makefile
 	src/Gnome.Keyring/AssemblyInfo.cs
+	gnome-keyring-sharp-glue/Makefile
 	docs/Makefile
 	sample/Makefile
 ])

=== added directory 'gnome-keyring-sharp-glue'
=== added file 'gnome-keyring-sharp-glue/Makefile.am'
--- gnome-keyring-sharp-glue/Makefile.am	1970-01-01 00:00:00 +0000
+++ gnome-keyring-sharp-glue/Makefile.am	2010-03-30 04:29:24 +0000
@@ -0,0 +1,6 @@
+lib_LTLIBRARIES = libgnome-keyring-sharp-glue.la
+
+libgnome_keyring_sharp_glue_la_SOURCES = glue.c
+libgnome_keyring_sharp_glue_la_LDFLAGS = -module -avoid-version -no-undefined
+libgnome_keyring_sharp_glue_la_LIBADD = $(GNOME_KEYRING_LIBS)
+libgnome_keyring_sharp_glue_la_CFLAGS = $(GNOME_KEYRING_CFLAGS)

=== added file 'gnome-keyring-sharp-glue/glue.c'
--- gnome-keyring-sharp-glue/glue.c	1970-01-01 00:00:00 +0000
+++ gnome-keyring-sharp-glue/glue.c	2010-03-29 04:21:43 +0000
@@ -0,0 +1,36 @@
+#include <gnome-keyring.h>
+
+gpointer gks_attribute_list_new ()
+{
+	return gnome_keyring_attribute_list_new ();
+}
+
+gint32 gks_item_attribute_list_get_length (GnomeKeyringAttributeList *attrs)
+{
+	return (*attrs).len;
+}
+
+gboolean gks_item_attribute_list_index_is_string (GnomeKeyringAttributeList *attrs, gint32 index)
+{
+	return gnome_keyring_attribute_list_index (attrs, index).type == GNOME_KEYRING_ATTRIBUTE_TYPE_STRING;
+}
+
+gboolean gks_item_attribute_list_index_is_uint32 (GnomeKeyringAttributeList *attrs, gint32 index)
+{
+	return gnome_keyring_attribute_list_index (attrs, index).type == GNOME_KEYRING_ATTRIBUTE_TYPE_UINT32;
+}
+
+char * gks_item_attribute_list_get_index_string (GnomeKeyringAttributeList *attrs, gint32 index)
+{
+	return gnome_keyring_attribute_list_index (attrs, index).value.string;
+}
+
+guint32 gks_item_attribute_list_get_index_uint32 (GnomeKeyringAttributeList *attrs, gint32 index)
+{
+	return gnome_keyring_attribute_list_index (attrs, index).value.integer;
+}
+
+char * gks_item_attribute_list_get_index_key (GnomeKeyringAttributeList *attrs, gint32 index)
+{
+	return gnome_keyring_attribute_list_index (attrs, index).name;
+}

=== added file 'gnome-keyring-sharp-glue/gnome-keyring-sharp-glue.cproj'
--- gnome-keyring-sharp-glue/gnome-keyring-sharp-glue.cproj	1970-01-01 00:00:00 +0000
+++ gnome-keyring-sharp-glue/gnome-keyring-sharp-glue.cproj	2010-03-29 01:45:21 +0000
@@ -0,0 +1,1 @@
+<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>9.0.21022</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{870C2CD7-985E-48CD-9D22-48AD243819C3}</ProjectGuid>
    <Compiler>
      <Compiler ctype="GccCompiler" xmlns="" />
    </Compiler>
    <Language>C</Language>
    <Target>Bin</Target>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\Debug</OutputPath>
    <Libs>
      <Libs xmlns="">
        <Lib>gnome-keyring</Lib>
        <Lib>glib-2.0</Lib>
      </Libs>
    </Libs>
    <DefineSymbols>DEBUG MONODEVELOP</DefineSymbols>
    <SourceDirectory>.</SourceDirectory>
    <OutputName>gnome-keyring-sharp-glue</OutputName>
    <CompileTarget>SharedLibrary</CompileTarget>
    <Includes>
      <Includes xmlns="">
        <Include>/usr/include/gnome-keyring-1</Include>
        <Include>/usr/include/glib-2.0</Include>
        <Include>/usr/lib/glib-2.0/include</Include>
      </Includes>
    </Includes>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <OutputPath>bin\Release</OutputPath>
    <DefineSymbols>MONODEVELOP</DefineSymbols>
    <SourceDirectory>.</SourceDirectory>
    <OptimizationLevel>3</OptimizationLevel>
    <OutputName>gnome-keyring-sharp-glue</OutputName>
    <CompileTarget>SharedLibrary</CompileTarget>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="glue.c" />
  </ItemGroup>
</Project>
\ No newline at end of file

=== added file 'gnome-keyring-sharp.csproj'
--- gnome-keyring-sharp.csproj	1970-01-01 00:00:00 +0000
+++ gnome-keyring-sharp.csproj	2010-03-29 02:30:34 +0000
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C9C7D12D-2534-4837-BD27-3B328CFC0C4F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>gnomekeyringsharp</RootNamespace>
+    <AssemblyName>gnome-keyring-sharp</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <DebugType>none</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <Compile Include="src\Gnome.Keyring\AccessRights.cs" />
+    <Compile Include="src\Gnome.Keyring\AttributeType.cs" />
+    <Compile Include="src\Gnome.Keyring\GenericItemData.cs" />
+    <Compile Include="src\Gnome.Keyring\ItemACL.cs" />
+    <Compile Include="src\Gnome.Keyring\ItemData.cs" />
+    <Compile Include="src\Gnome.Keyring\ItemType.cs" />
+    <Compile Include="src\Gnome.Keyring\KeyringException.cs" />
+    <Compile Include="src\Gnome.Keyring\KeyringInfo.cs" />
+    <Compile Include="src\Gnome.Keyring\NetItemData.cs" />
+    <Compile Include="src\Gnome.Keyring\NoteItemData.cs" />
+    <Compile Include="src\Gnome.Keyring\Operation.cs" />
+    <Compile Include="src\Gnome.Keyring\RequestMessage.cs" />
+    <Compile Include="src\Gnome.Keyring\ResponseMessage.cs" />
+    <Compile Include="src\Gnome.Keyring\ResultCode.cs" />
+    <Compile Include="src\Gnome.Keyring\Ring.cs" />
+    <Compile Include="Tests\TestRing.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="src\Gnome.Keyring\AssemblyInfo.cs.in" />
+    <None Include="src\Gnome.Keyring\Makefile.am" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="NDesk.DBus, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f6716e4f9b2ed099">
+      <Package>ndesk-dbus-1.0</Package>
+    </Reference>
+    <Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+      <Package>glib-sharp-2.0</Package>
+    </Reference>
+    <Reference Include="nunit.framework">
+      <SpecificVersion>False</SpecificVersion>
+      <Package>mono-nunit</Package>
+    </Reference>
+    <Reference Include="Mono.Posix" />
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Tests\" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="gnome-keyring-sharp-glue\gnome-keyring-sharp-glue.cproj">
+      <Project>{870C2CD7-985E-48CD-9D22-48AD243819C3}</Project>
+      <Name>gnome-keyring-sharp-glue</Name>
+    </ProjectReference>
+  </ItemGroup>
+</Project>
\ No newline at end of file

=== added file 'gnome-keyring-sharp.sln'
--- gnome-keyring-sharp.sln	1970-01-01 00:00:00 +0000
+++ gnome-keyring-sharp.sln	2010-03-29 01:38:17 +0000
@@ -0,0 +1,29 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gnome-keyring-sharp", "gnome-keyring-sharp.csproj", "{C9C7D12D-2534-4837-BD27-3B328CFC0C4F}"
+EndProject
+Project("{2857B73E-F847-4B02-9238-064979017E93}") = "gnome-keyring-sharp-glue", "gnome-keyring-sharp-glue\gnome-keyring-sharp-glue.cproj", "{870C2CD7-985E-48CD-9D22-48AD243819C3}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x86 = Debug|x86
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{870C2CD7-985E-48CD-9D22-48AD243819C3}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{870C2CD7-985E-48CD-9D22-48AD243819C3}.Debug|x86.Build.0 = Debug|Any CPU
+		{870C2CD7-985E-48CD-9D22-48AD243819C3}.Release|x86.ActiveCfg = Release|Any CPU
+		{870C2CD7-985E-48CD-9D22-48AD243819C3}.Release|x86.Build.0 = Release|Any CPU
+		{C9C7D12D-2534-4837-BD27-3B328CFC0C4F}.Debug|x86.ActiveCfg = Debug|x86
+		{C9C7D12D-2534-4837-BD27-3B328CFC0C4F}.Debug|x86.Build.0 = Debug|x86
+		{C9C7D12D-2534-4837-BD27-3B328CFC0C4F}.Release|x86.ActiveCfg = Release|x86
+		{C9C7D12D-2534-4837-BD27-3B328CFC0C4F}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = gnome-keyring-sharp.csproj
+		Policies = $0
+		$0.StandardHeader = $1
+		$1.inheritsSet = MITX11License
+	EndGlobalSection
+EndGlobal

=== added file 'src/Gnome.Keyring.dll.config'
--- src/Gnome.Keyring.dll.config	1970-01-01 00:00:00 +0000
+++ src/Gnome.Keyring.dll.config	2010-03-30 04:54:42 +0000
@@ -0,0 +1,3 @@
+<configuration>
+  <dllmap dll="libgnome-keyring.dll" target="libgnome-keyring.so.0"/>
+</configuration>

=== modified file 'src/Gnome.Keyring/Makefile.am'
--- src/Gnome.Keyring/Makefile.am	2006-08-08 03:35:09 +0000
+++ src/Gnome.Keyring/Makefile.am	2010-03-30 03:29:10 +0000
@@ -10,8 +10,5 @@
 		KeyringInfo.cs \
 		NetItemData.cs \
 		NoteItemData.cs \
-		Operation.cs \
-		RequestMessage.cs \
-		ResponseMessage.cs \
 		ResultCode.cs \
 		Ring.cs

=== removed file 'src/Gnome.Keyring/Operation.cs'
--- src/Gnome.Keyring/Operation.cs	2006-08-01 19:08:46 +0000
+++ src/Gnome.Keyring/Operation.cs	1970-01-01 00:00:00 +0000
@@ -1,54 +0,0 @@
-//
-// Gnome.Keyring.Operation.cs
-//
-// Authors:
-//	Gonzalo Paniagua Javier (gonzalo@ximian.com)
-//
-// (C) Copyright 2006 Novell, Inc. (http://www.novell.com)
-//
-
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-namespace Gnome.Keyring {
-	enum Operation {
-		LockAll,
-		SetDefaultKeyring,
-		GetDefaultKeyring,
-		ListKeyrings,
-		CreateKeyring,
-		LockKeyring,
-		UnlockKeyring,
-		DeleteKeyring,
-		GetKeyringInfo,
-		SetKeyringInfo,
-		ListItems,
-		Find,
-		CreateItem,
-		DeleteItem,
-		GetItemInfo,
-		SetItemInfo,
-		GetItemAttributes,
-		SetItemAttributes,
-		GetItemACL,
-		SetItemACL
-	}
-}
-

=== removed file 'src/Gnome.Keyring/RequestMessage.cs'
--- src/Gnome.Keyring/RequestMessage.cs	2006-08-07 15:38:59 +0000
+++ src/Gnome.Keyring/RequestMessage.cs	1970-01-01 00:00:00 +0000
@@ -1,173 +0,0 @@
-//
-// Gnome.Keyring.RequestMessage.cs
-//
-// Authors:
-//	Gonzalo Paniagua Javier (gonzalo@ximian.com)
-//
-// (C) Copyright 2006 Novell, Inc. (http://www.novell.com)
-//
-
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-namespace Gnome.Keyring {
-	class RequestMessage {
-		MemoryStream stream = new MemoryStream ();
-		int op_start = -1;
-
-		public MemoryStream Stream {
-			get { return stream; }
-		}
-
-		public void CreateSimpleOperation (Operation op)
-		{
-			StartOperation (op);
-			EndOperation ();
-		}
-
-		public void CreateSimpleOperation (Operation op, string str1)
-		{
-			StartOperation (op);
-			Write (str1);
-			EndOperation ();
-		}
-
-		public void CreateSimpleOperation (Operation op, string str1, string str2)
-		{
-			StartOperation (op);
-			Write (str1);
-			Write (str2);
-			EndOperation ();
-		}
-
-		public void CreateSimpleOperation (Operation op, string str1, int i1)
-		{
-			StartOperation (op);
-			Write (str1);
-			Write (i1);
-			EndOperation ();
-		}
-
-		public void StartOperation (Operation op)
-		{
-			string appname = Ring.ApplicationName;
-			BinaryWriter writer = new BinaryWriter (stream);
-			writer.Write (0);
-
-			Write (appname);
-			int curpos = (int) stream.Position;
-			stream.Position = 0;
-			writer = new BinaryWriter (stream);
-			writer.Write (SwapBytes (curpos));
-			stream.Position = curpos;
-
-			op_start = (int) stream.Length;
-			writer.Write (0);
-			writer.Write (SwapBytes ((int) op));
-		}
-
-		public void EndOperation ()
-		{
-			int current = (int) stream.Length;
-			int size = SwapBytes (current - op_start);
-			stream.Position = op_start;
-			BinaryWriter writer = new BinaryWriter (stream);
-			writer.Write (size);
-		}
-
-		public void Write (string str)
-		{
-			WriteString (new BinaryWriter (stream), str);
-		}
-
-		static void WriteString (BinaryWriter writer, string str)
-		{
-			if (str == null) {
-				writer.Write ((int) -1);
-				return;
-			}
-			byte [] bytes = Encoding.UTF8.GetBytes (str);
-			writer.Write (SwapBytes (bytes.Length));
-			writer.Write (bytes);
-		}
-
-		public void Write (int i)
-		{
-			BinaryWriter writer = new BinaryWriter (stream);
-			writer.Write (SwapBytes (i));
-		}
-
-		public void WriteAttributes (Hashtable atts)
-		{
-			Hashtable copy = new Hashtable ();
-			foreach (string key in atts.Keys) {
-				object o = atts [key];
-				if (o != null)
-					copy [key] = o;
-				
-			}
-			BinaryWriter writer = new BinaryWriter (stream);
-			writer.Write (SwapBytes (copy.Count));
-			foreach (string key in copy.Keys) {
-				object o = atts [key];
-				if (o is string) {
-					EncodeAttribute (writer, key, (string) o);
-				} else if (o is int) {
-					int i = (int) o;
-					if (key == "port" && i == 0)
-						continue;
-					EncodeAttribute (writer, key, i);
-				} else {
-					throw new Exception ("Should not happen.");
-				}
-			}
-		}
-
-		static void EncodeAttribute (BinaryWriter writer, string name, string val)
-		{
-			WriteString (writer, name);
-			writer.Write (SwapBytes ((int) AttributeType.String));
-			WriteString (writer, val);
-		}
-
-		static void EncodeAttribute (BinaryWriter writer, string name, int val)
-		{
-			WriteString (writer, name);
-			writer.Write (SwapBytes ((int) AttributeType.UInt32));
-			writer.Write (SwapBytes (val));
-		}
-
-		static int SwapBytes (int i)
-		{
-			byte b0 = (byte) ((i >> 24) & 0xFF);
-			byte b1 = (byte) ((i >> 16) & 0xFF);
-			byte b2 = (byte) ((i >> 8) & 0xFF);
-			byte b3 = (byte) (i & 0xFF);
-			return b0 + (b1 << 8) + (b2 << 16) + (b3 << 24);
-		}
-
-	}
-}
-

=== removed file 'src/Gnome.Keyring/ResponseMessage.cs'
--- src/Gnome.Keyring/ResponseMessage.cs	2006-08-08 03:35:09 +0000
+++ src/Gnome.Keyring/ResponseMessage.cs	1970-01-01 00:00:00 +0000
@@ -1,108 +0,0 @@
-//
-// Gnome.Keyring.ResponseMessage.cs
-//
-// Authors:
-//	Gonzalo Paniagua Javier (gonzalo@ximian.com)
-//
-// (C) Copyright 2006 Novell, Inc. (http://www.novell.com)
-//
-
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Collections;
-using System.IO;
-using System.Text;
-
-using Mono.Unix.Native;
-
-namespace Gnome.Keyring {
-	class ResponseMessage {
-		byte [] buffer;
-		MemoryStream stream;
-
-		public ResponseMessage (byte [] buffer)
-		{
-			this.buffer = buffer;
-			stream = new MemoryStream (buffer);
-		}
-
-		public bool DataAvailable {
-			get { return (stream.Position < stream.Length); }
-		}
-
-		public string [] GetStringList ()
-		{
-			int nstrings = GetInt32 ();
-			string [] list = new string [nstrings];
-			for (int i = 0; i < nstrings; i++) {
-				list [i] = GetString ();
-			}
-
-			return list;
-		}
-
-		public string GetString ()
-		{
-			int len = GetInt32 ();
-			if (len == -1) {
-				return null;
-			}
-			int offset = (int) stream.Position;
-			string result =  Encoding.UTF8.GetString (buffer, offset, len);
-			stream.Position += len;
-			return result;
-		}
-
-		public int GetInt32 ()
-		{
-			byte b3 = (byte) stream.ReadByte ();
-			byte b2 = (byte) stream.ReadByte ();
-			byte b1 = (byte) stream.ReadByte ();
-			byte b0 = (byte) stream.ReadByte ();
-			return (b0 + (b1 << 8) + (b2 << 16) + (b3 << 24));
-		}
-
-		public DateTime GetDateTime ()
-		{
-			return NativeConvert.FromTimeT ((GetInt32 () << 32) + GetInt32 ());
-		}
-
-		public void ReadAttributes (Hashtable tbl)
-		{
-			int natts = GetInt32 ();
-			for (int i = 0; i < natts; i++) {
-				object val;
-				string name = GetString ();
-				AttributeType type = (AttributeType) GetInt32 ();
-				if (AttributeType.String == type) {
-					val = GetString ();
-				} else if (type == AttributeType.UInt32) {
-					val = GetInt32 ();
-				} else {
-					throw new Exception ("This should not happen: "  + type);
-				}
-				tbl [name] = val;
-			}
-		}
-	}
-}
-

=== modified file 'src/Gnome.Keyring/Ring.cs'
--- src/Gnome.Keyring/Ring.cs	2008-10-14 10:40:30 +0000
+++ src/Gnome.Keyring/Ring.cs	2010-03-30 03:41:31 +0000
@@ -31,16 +31,16 @@
 
 using System;
 using System.Collections;
+using System.Collections.Generic;
 using System.IO;
 using System.Net;
 using System.Net.Sockets;
 using System.Reflection;
+using System.Runtime.InteropServices;
 
 using Mono.Unix;
 
-#if WITH_DBUS
-using NDesk.DBus;
-#endif
+using GLib;
 
 namespace Gnome.Keyring {
 	public class Ring {
@@ -70,396 +70,579 @@
 			}
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern bool gnome_keyring_is_available ();
+		
 		public static bool Available {
 			get {
-				Socket sock = Connect ();
-				if (sock != null) {
-					sock.Close ();
-					return true;
-				}
-				return false;
-			}
-		}
-
-		static Socket Connect ()
-		{
-			string filename;
-			Socket sock;
-		 
-			filename = Environment.GetEnvironmentVariable ("GNOME_KEYRING_SOCKET");
-			sock = Connect (filename);
-
-#if WITH_DBUS
-			if (sock == null) {
-				try {
-					filename = Bus.Session.GetObject<IDaemon> ("org.gnome.keyring", new ObjectPath ("/org/gnome/keyring/daemon")).GetSocketPath ();
-				} catch (Exception) {
-					filename = null;
-				}
-				sock = Connect (filename);
-			}
-#endif
-
-			return sock;
-		}
-
-		static Socket Connect (string filename)
-		{
-			if (filename == null || filename == "")
-				return null;
-
-			EndPoint ep = new UnixEndPoint (filename);
-			Socket sock = new Socket (AddressFamily.Unix, SocketType.Stream, ProtocolType.IP);
-			try {
-				sock.Connect (ep);
-			} catch (Exception) {
-				sock.Close ();
-				return null;
-			}
-			return sock;
-		}
-
-		static int GetInt32 (Socket sock)
-		{
-			byte [] cuatro = new byte [4];
-			if (sock.Receive (cuatro) != 4)
-				throw new KeyringException (ResultCode.IOError);
-			return (cuatro [3] + (cuatro [2] << 8) + (cuatro [1] << 16) + (cuatro [0] << 24));
-		}
-
-		static byte [] one = new byte [1];
-		static ResponseMessage SendRequest (MemoryStream stream)
-		{
-			Socket sock = Connect ();
-			if (sock == null)
-				throw new KeyringException (ResultCode.NoKeyringDaemon);
-
-			try {
-				sock.Send (one); // Credentials byte
-				byte [] buffer = stream.ToArray ();
-				sock.Send (buffer);
-				int packet_size = GetInt32 (sock) - 4;
-				if (packet_size < 0)
-					throw new KeyringException (ResultCode.IOError);
-				byte [] response = new byte [packet_size];
-				int nbytes = sock.Receive (response);
-				if (nbytes != response.Length)
-					throw new KeyringException (ResultCode.IOError);
-				ResponseMessage resp = new ResponseMessage (response);
-				ResultCode result = (ResultCode) resp.GetInt32 ();
-				if (result != 0)
-					throw new KeyringException (result);
-
-				return resp;
-			} finally {
-				sock.Close ();
-			}
-		}
-
+				return gnome_keyring_is_available ();
+			}
+		}
+
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_lock_all_sync ();
+		
 		public static void LockAll ()
 		{
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.LockAll);
-			SendRequest (req.Stream);
+			ResultCode result = gnome_keyring_lock_all_sync ();
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_set_default_keyring_sync (string keyring);
+		
 		public static void SetDefaultKeyring (string newKeyring)
 		{
 			if (newKeyring == null)
 				throw new ArgumentNullException ("newKeyring");
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.SetDefaultKeyring, newKeyring);
-			SendRequest (req.Stream);
+			ResultCode result = gnome_keyring_set_default_keyring_sync (newKeyring);
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_get_default_keyring_sync (out IntPtr keyring);
+		
 		public static string GetDefaultKeyring ()
 		{
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.GetDefaultKeyring);
-			ResponseMessage resp = SendRequest (req.Stream);
-			return resp.GetString ();
+			IntPtr keyring_name;
+			ResultCode result = gnome_keyring_get_default_keyring_sync (out keyring_name);
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			return GLib.Marshaller.PtrToStringGFree (keyring_name);
 		}
 
-		public static string [] GetKeyrings ()
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_list_keyring_names_sync (out IntPtr keyringList);
+		
+		[DllImport ("libgnome-keyring.dll")]
+		static extern void gnome_keyring_string_list_free (IntPtr stringList);
+		
+		public static string[] GetKeyrings ()
 		{
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.ListKeyrings);
-			ResponseMessage resp = SendRequest (req.Stream);
-			return resp.GetStringList ();
+			IntPtr keyring_list;
+			ResultCode result = gnome_keyring_list_keyring_names_sync (out keyring_list);
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			var retval = (string[])GLib.Marshaller.ListPtrToArray (keyring_list, typeof(GLib.List), false, false, typeof(string));
+			gnome_keyring_string_list_free (keyring_list);
+			return retval;
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_create_sync (string keyringName, string password);
+		
 		public static void CreateKeyring (string name, string password)
 		{
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.CreateKeyring, name, password);
-			SendRequest (req.Stream);
+			ResultCode result = gnome_keyring_create_sync (name, password);
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
 		}
-
+		
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_lock_sync (string keyring);
+		
 		public static void Lock (string keyring)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.LockKeyring, keyring);
-			SendRequest (req.Stream);
+			ResultCode result = gnome_keyring_lock_sync (keyring);
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
 		}
+		
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_unlock_sync (string keyring, string password);
 
 		public static void Unlock (string keyring, string password)
 		{
-			if (keyring == null)
-				throw new ArgumentNullException ("keyring");
-
-			if (password == null)
-				throw new ArgumentNullException ("password");
-
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.UnlockKeyring, keyring, password);
-			try {
-				SendRequest (req.Stream);
-			} catch (KeyringException ke) {
-				if (ke.ResultCode != ResultCode.AlreadyUnlocked)
-					throw;
+			ResultCode result = gnome_keyring_unlock_sync (keyring, password);
+			
+			if (!(result == ResultCode.Ok || result == ResultCode.AlreadyUnlocked)) {
+				throw new KeyringException (result);
 			}
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_delete_sync (string keyring);
+		
 		public static void DeleteKeyring (string keyring)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.DeleteKeyring, keyring);
-			SendRequest (req.Stream);
+			ResultCode result = gnome_keyring_delete_sync (keyring);
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
 		}
 
-		public static int [] ListItemIDs (string keyring)
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_list_item_ids_sync (string keyring, out IntPtr ids);
+		
+		public static int[] ListItemIDs (string keyring)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.ListItems, keyring);
-			ResponseMessage resp = SendRequest (req.Stream);
-			int len = resp.GetInt32 ();
-			int [] result = new int [len];
-			for (int i = 0; i < len; i++) {
-				result [i] = resp.GetInt32 ();
-			}
-
-			return result;
-		}
-
+			IntPtr idlist;
+			ResultCode result = gnome_keyring_list_item_ids_sync (keyring, out idlist);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			
+			IntPtr[] ptrArray = (IntPtr[])GLib.Marshaller.ListPtrToArray (idlist, typeof(GLib.List), true, false, typeof(IntPtr));
+			int[] ids = new int[ptrArray.Length];
+			for (int i = 0; i < ptrArray.Length; i++) {
+				ids[i] = ptrArray[i].ToInt32 ();
+			}
+			
+			return ids;
+		}
+
+		
+		static void NativeListFromAttributes (IntPtr attrList, Hashtable attributes)
+		{
+			foreach (string key in attributes.Keys) {
+				if (attributes[key] is string) {
+					gnome_keyring_attribute_list_append_string (attrList, key, (string)attributes[key]);
+				} else if (attributes[key] is int) {
+					gnome_keyring_attribute_list_append_uint32 (attrList, key, (uint)((int)attributes[key]));
+				} else {
+					throw new ArgumentException (String.Format ("Attribute \"{0}\" has invalid parameter type: {1}", key, attributes[key].GetType ()));
+				}
+			}
+		}
+		
+		static void AttributesFromNativeList (IntPtr attrList, Hashtable attributes)
+		{
+			int listLength = gks_item_attribute_list_get_length (attrList);
+			for (int i = 0; i < listLength; i++) {
+				string key = Marshal.PtrToStringAnsi (gks_item_attribute_list_get_index_key (attrList, i));
+				if (gks_item_attribute_list_index_is_string (attrList, i)) {
+					attributes[key] = Marshal.PtrToStringAnsi (gks_item_attribute_list_get_index_string (attrList, i));
+				} else if (gks_item_attribute_list_index_is_uint32 (attrList, i)) {
+					attributes[key] = (int)gks_item_attribute_list_get_index_uint32 (attrList, i);
+				}
+			}
+		}
+		
+		[StructLayout(LayoutKind.Sequential)]
+		struct GnomeKeyringFound
+		{
+			public IntPtr keyring;
+			public UInt32 item_id;
+			public IntPtr attrList;
+			public IntPtr secret;
+		}
+		
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_find_items_sync (ItemType type, IntPtr attrList, out IntPtr foundList);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern void gnome_keyring_found_list_free (IntPtr foundList);
+		
 		static ItemData [] empty_item_data = new ItemData [0];
-		public static ItemData [] Find (ItemType type, Hashtable atts)
+		public static ItemData[] Find (ItemType type, Hashtable atts)
 		{
 			if (atts == null)
 				throw new ArgumentNullException ("atts");
-			RequestMessage req = new RequestMessage ();
-			req.StartOperation (Operation.Find);
-			req.Write ((int) type);
-			req.WriteAttributes (atts);
-			req.EndOperation ();
-
-			ResponseMessage resp = null;
-			try {
-				resp = SendRequest (req.Stream);
-			} catch (KeyringException ke) {
-				if (ke.ResultCode == ResultCode.Denied ||
-				    ke.ResultCode == ResultCode.NoMatch)
-					return empty_item_data;
-				throw;
+			
+			IntPtr passwordList;
+			IntPtr attrList = gks_attribute_list_new ();
+			
+			NativeListFromAttributes (attrList, atts);
+			
+			ResultCode result = gnome_keyring_find_items_sync (type, attrList, out passwordList);
+			
+			if (result == ResultCode.Denied || result == ResultCode.NoMatch) {
+				return empty_item_data;
+			}
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			
+			IntPtr[] passwordStructs = (IntPtr[])GLib.Marshaller.ListPtrToArray (passwordList, typeof(GLib.List), false, false, typeof(IntPtr));
+			List<GnomeKeyringFound> passwords = new List<GnomeKeyringFound> ();
+			
+			foreach (IntPtr ptr in passwordStructs) {
+				passwords.Add ((GnomeKeyringFound)Marshal.PtrToStructure (ptr, typeof(GnomeKeyringFound)));
 			}
 
 			ArrayList list = new ArrayList ();
-			while (resp.DataAvailable) {
+			foreach (var password in passwords) {
 				ItemData found = ItemData.GetInstanceFromItemType (type);
-				found.Keyring = resp.GetString ();
-				found.ItemID = resp.GetInt32 ();
-				found.Secret = resp.GetString ();
+				found.ItemID = (int)password.item_id;
+				found.Secret = Marshal.PtrToStringAnsi (password.secret);
+				found.Keyring = Marshal.PtrToStringAnsi (password.keyring);
 				found.Attributes = new Hashtable ();
-				resp.ReadAttributes (found.Attributes);
+				AttributesFromNativeList (password.attrList, found.Attributes);
 				found.SetValuesFromAttributes ();
 				list.Add (found);
 			}
 
+			gnome_keyring_found_list_free (passwordList);
+			gnome_keyring_attribute_list_free (attrList);
+			
 			return (ItemData []) list.ToArray (typeof (ItemData));
 		}
 
+		[StructLayout (LayoutKind.Sequential)]
+		struct GnomeKeyringNetworkPasswordData
+		{
+			public IntPtr keyring;
+			public UInt32 item_id;
+			
+			public IntPtr protocol;
+			public IntPtr server;
+			public IntPtr @object;
+			public IntPtr authtype;
+			public UInt32 port;
+			
+			public IntPtr user;
+			public IntPtr domain;
+			public IntPtr password;
+		}
+		
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_find_network_password_sync (string user, string domain, string server,
+			string @object, string protocol, string authtype, UInt32 port, out IntPtr passwordList);
+		
 		static NetItemData [] empty_net_item_data = new NetItemData [0];
-		public static NetItemData [] FindNetworkPassword (string user, string domain, string server, string obj,
+		public static NetItemData[] FindNetworkPassword (string user, string domain, string server, string obj,
 									string protocol, string authtype, int port)
 		{
-			RequestMessage req = new RequestMessage ();
-			req.StartOperation (Operation.Find);
-			req.Write ((int) ItemType.NetworkPassword);
-			Hashtable tbl = new Hashtable ();
-			tbl ["user"] = user;
-			tbl ["domain"] = domain;
-			tbl ["server"] = server;
-			tbl ["object"] = obj;
-			tbl ["protocol"] = protocol;
-			tbl ["authtype"] = authtype;
-			if (port != 0)
-				tbl ["port"] = port;
-			req.WriteAttributes (tbl);
-			req.EndOperation ();
-
-			ResponseMessage resp = null;
-			try {
-				resp = SendRequest (req.Stream);
-			} catch (KeyringException ke) {
-				if (ke.ResultCode == ResultCode.Denied ||
-				    ke.ResultCode == ResultCode.NoMatch)
-					return empty_net_item_data;
-				throw;
-			}
+			IntPtr passwordList;
+			
+			ResultCode result = gnome_keyring_find_network_password_sync (user, domain, server, obj, protocol, authtype, (uint)port, out passwordList);
+			
+			if (result == ResultCode.Denied || result == ResultCode.NoMatch) {
+				return empty_net_item_data;
+			}
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			
+			IntPtr[] passwordStructs = (IntPtr[])GLib.Marshaller.ListPtrToArray (passwordList, typeof(GLib.List), false, false, typeof(IntPtr));
+			List<GnomeKeyringNetworkPasswordData> passwords = new List<GnomeKeyringNetworkPasswordData> ();
+			
+			foreach (IntPtr ptr in passwordStructs) {
+				passwords.Add ((GnomeKeyringNetworkPasswordData)Marshal.PtrToStructure (ptr, typeof(GnomeKeyringNetworkPasswordData)));
+			}
+			
 			ArrayList list = new ArrayList ();
-			while (resp.DataAvailable) {
+			foreach (var password in passwords) {
 				NetItemData found = new NetItemData ();
-				found.Keyring = resp.GetString ();
-				found.ItemID = resp.GetInt32 ();
-				found.Secret = resp.GetString ();
+				found.Keyring = Marshal.PtrToStringAnsi (password.keyring);
+				found.ItemID = (int)password.item_id;
+				found.Secret = Marshal.PtrToStringAnsi (password.password);
 				found.Attributes = new Hashtable ();
-				resp.ReadAttributes (found.Attributes);
+				
+				SetAttributeIfNonNull (found.Attributes, "protocol", password.protocol);
+				SetAttributeIfNonNull (found.Attributes, "server", password.server);
+				SetAttributeIfNonNull (found.Attributes, "object", password.@object);
+				SetAttributeIfNonNull (found.Attributes, "authtype", password.authtype);
+				SetAttributeIfNonNull (found.Attributes, "user", password.user);
+				SetAttributeIfNonNull (found.Attributes, "domain", password.domain);
+
+				if (password.port != 0) {
+					found.Attributes["port"] = (int)password.port;
+				}
+				
 				found.SetValuesFromAttributes ();
 				list.Add (found);
 			}
 
 			return (NetItemData []) list.ToArray (typeof (NetItemData));
 		}
+		
+		static void SetAttributeIfNonNull (Hashtable attrs, string key, IntPtr maybeString)
+		{
+			if (maybeString != IntPtr.Zero) {
+				attrs[key] = Marshal.PtrToStringAnsi (maybeString);
+			}
+		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_item_create_sync (string keyring, 
+			ItemType type, 
+			string displayName, 
+			IntPtr attributes,
+			IntPtr secret,
+			bool updateIfExists,
+			out UInt32 itemId);
+		
+		[DllImport ("libgnome-keyring.dll")]
+		static extern IntPtr gnome_keyring_memory_strdup (string str);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern void gnome_keyring_memory_free (IntPtr str);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern void gnome_keyring_attribute_list_append_string (IntPtr attributes, string name, string val);
+		[DllImport("libgnome-keyring.dll")]
+		static extern void gnome_keyring_attribute_list_append_uint32 (IntPtr attributes, string name, UInt32 val);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern void gnome_keyring_attribute_list_free (IntPtr attributes);
+		[DllImport ("gnome-keyring-sharp-glue.dll")]
+		static extern IntPtr gks_attribute_list_new ();
+		
 		public static int CreateItem (string keyring, ItemType type, string displayName, Hashtable attributes,
 						string secret, bool updateIfExists)
 		{
-			RequestMessage req = new RequestMessage ();
-			req.StartOperation (Operation.CreateItem);
-			req.Write (keyring);
-			req.Write (displayName);
-			req.Write (secret);
-			req.WriteAttributes (attributes);
-			req.Write ((int) type);
-			req.Write (updateIfExists ? 1 : 0);
-			req.EndOperation ();
-			ResponseMessage resp = SendRequest (req.Stream);
-			return resp.GetInt32 ();
+			uint id;
+			IntPtr secure_secret = gnome_keyring_memory_strdup (secret);
+			IntPtr attrs = gks_attribute_list_new ();
+			
+			NativeListFromAttributes (attrs, attributes);
+			
+			ResultCode result = gnome_keyring_item_create_sync (keyring, type, displayName, attrs, secure_secret, updateIfExists, out id);
+			
+			gnome_keyring_attribute_list_free (attrs);
+			gnome_keyring_memory_free (secure_secret);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			
+			return (int)id;
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_item_delete_sync (string keyring, UInt32 id);
+		
 		public static void DeleteItem (string keyring, int id)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.DeleteItem, keyring, id);
-			SendRequest (req.Stream);
+			ResultCode result = gnome_keyring_item_delete_sync (keyring, (uint)id);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_set_network_password_sync (string keyring,
+			string user,
+			string domain,
+			string server,
+			string @object,
+			string protocol,
+			string authType,
+			UInt32 port,
+			string password,
+			out UInt32 id);
+		
 		public static int CreateOrModifyNetworkPassword (string keyring, string user, string domain, string server, string obj,
 								string protocol, string authtype, int port, string password)
 		{
-			Hashtable tbl = new Hashtable ();
-			tbl ["user"] = user;
-			tbl ["domain"] = domain;
-			tbl ["server"] = server;
-			tbl ["object"] = obj;
-			tbl ["protocol"] = protocol;
-			tbl ["authtype"] = authtype;
-			if (port != 0)
-				tbl ["port"] = port;
-
-			string display_name;
-			if (port != 0)
-				display_name = String.Format ("{0}@{1}:{3}/{2}", user, server, obj, port);
-			else
-				display_name = String.Format ("{0}@{1}/{2}", user, server, obj);
-
-			return CreateItem (keyring, ItemType.NetworkPassword, display_name, tbl, password, true);
+			uint id;
+			ResultCode result = gnome_keyring_set_network_password_sync (keyring, user, domain, server, obj, protocol, authtype, (uint)port, password, out id);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			
+			return (int)id;
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_item_get_info_sync (string keyring, UInt32 id, out IntPtr itemInfo);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ItemType gnome_keyring_item_info_get_type (IntPtr itemInfo);
+		[DllImport("libgnome-keyring.dll")]
+		static extern IntPtr gnome_keyring_item_info_get_ctime (IntPtr itemInfo);
+		[DllImport("libgnome-keyring.dll")]
+		static extern IntPtr gnome_keyring_item_info_get_mtime (IntPtr itemInfo);
+		[DllImport("libgnome-keyring.dll")]
+		static extern IntPtr gnome_keyring_item_info_get_display_name (IntPtr itemInfo);
+		[DllImport("libgnome-keyring.dll")]
+		static extern IntPtr gnome_keyring_item_info_get_secret (IntPtr itemInfo);
+		[DllImport("libgnome-keyring.dll")]
+		static extern void gnome_keyring_item_info_free (IntPtr itemInfo);
+		
 		public static ItemData GetItemInfo (string keyring, int id)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.GetItemInfo, keyring, id);
-			ResponseMessage resp = SendRequest (req.Stream);
-			ItemType itype = (ItemType) resp.GetInt32 ();
-			ItemData item = ItemData.GetInstanceFromItemType (itype);
-			string name = resp.GetString ();
-			string secret = resp.GetString ();
-			DateTime mtime = resp.GetDateTime ();
-			DateTime ctime =  resp.GetDateTime ();
+			IntPtr itemInfo;
+			
+			ResultCode result = gnome_keyring_item_get_info_sync (keyring, (uint)id, out itemInfo);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			
+			ItemData item = ItemData.GetInstanceFromItemType (gnome_keyring_item_info_get_type (itemInfo));
+			item.Attributes = new Hashtable ();
+			item.Attributes["keyring_ctime"] = GLib.Marshaller.time_tToDateTime (gnome_keyring_item_info_get_ctime (itemInfo));
+			item.Attributes["keyring_mtime"] = GLib.Marshaller.time_tToDateTime (gnome_keyring_item_info_get_mtime (itemInfo));
+			item.Attributes["name"] = Marshal.PtrToStringAnsi (gnome_keyring_item_info_get_display_name (itemInfo));
+			
 			item.Keyring = keyring;
 			item.ItemID = id;
-			item.Secret = secret;
-			Hashtable tbl = new Hashtable ();
-			tbl ["name"] = name;
-			tbl ["keyring_ctime"] = ctime;
-			tbl ["keyring_mtime"] = mtime;
-			item.Attributes = tbl;
+			item.Secret = Marshal.PtrToStringAnsi (gnome_keyring_item_info_get_secret (itemInfo));
+
 			item.SetValuesFromAttributes ();
+			
+			gnome_keyring_item_info_free (itemInfo);
+			
 			return item;
 		}
+		
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_item_set_info_sync (string keyring, UInt32 id, IntPtr itemInfo);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern IntPtr gnome_keyring_item_info_new ();
+		[DllImport ("libgnome-keyring.dll")]
+		static extern void gnome_keyring_item_info_set_display_name (IntPtr itemInfo, string displayName);
+		[DllImport("libgnome-keyring.dll")]
+		static extern void gnome_keyring_item_info_set_type (IntPtr itemInfo, ItemType type);
+		[DllImport("libgnome-keyring.dll")]
+		static extern void gnome_keyring_item_info_set_secret (IntPtr itemInfo, string secret);
 
 		public static void SetItemInfo (string keyring, int id, ItemType type, string displayName, string secret)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.StartOperation (Operation.SetItemInfo);
-			req.Write (keyring);
-			req.Write (id);
-			req.Write ((int) type);
-			req.Write (displayName);
-			req.Write (secret);
-			req.EndOperation ();
-			SendRequest (req.Stream);
+			IntPtr itemInfo = gnome_keyring_item_info_new ();
+			gnome_keyring_item_info_set_display_name (itemInfo, displayName);
+			gnome_keyring_item_info_set_type (itemInfo, type);
+			gnome_keyring_item_info_set_secret (itemInfo, secret);
+			
+			ResultCode result = gnome_keyring_item_set_info_sync (keyring, (uint)id, itemInfo);
+			
+			gnome_keyring_item_info_free (itemInfo);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_item_get_attributes_sync (string keyring, UInt32 id, out IntPtr attributes);
+		[DllImport ("gnome-keyring-sharp-glue.dll")]
+		static extern int gks_item_attribute_list_get_length (IntPtr attrList);
+		[DllImport ("gnome-keyring-sharp-glue.dll")]
+		static extern bool gks_item_attribute_list_index_is_string (IntPtr attrList, int index);
+		[DllImport("gnome-keyring-sharp-glue.dll")]
+		static extern bool gks_item_attribute_list_index_is_uint32 (IntPtr attrList, int index);
+		[DllImport ("gnome-keyring-sharp-glue.dll")]
+		static extern IntPtr gks_item_attribute_list_get_index_string (IntPtr attrList, int index);
+		[DllImport ("gnome-keyring-sharp-glue.dll")]
+		static extern UInt32 gks_item_attribute_list_get_index_uint32 (IntPtr attrList, int index);
+		[DllImport ("gnome-keyring-sharp-glue.dll")]
+		static extern IntPtr gks_item_attribute_list_get_index_key (IntPtr attrList, int index);
+		
 		public static Hashtable GetItemAttributes (string keyring, int id)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.GetItemAttributes, keyring, id);
-			ResponseMessage resp = SendRequest (req.Stream);
-			Hashtable tbl = new Hashtable ();
-			resp.ReadAttributes (tbl);
-			return tbl;
+			IntPtr attributes;
+			Hashtable retVal = new Hashtable ();
+			
+			ResultCode result = gnome_keyring_item_get_attributes_sync (keyring, (uint)id, out attributes);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			
+			AttributesFromNativeList (attributes, retVal);
+			
+			gnome_keyring_attribute_list_free (attributes);
+			
+			return retVal;
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_item_set_attributes_sync (string keyring, UInt32 id, IntPtr attrList);
+		
 		public static void SetItemAttributes (string keyring, int id, Hashtable atts)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.StartOperation (Operation.SetItemAttributes);
-			req.Write (keyring);
-			req.Write (id);
-			req.WriteAttributes (atts);
-			req.EndOperation ();
-			SendRequest (req.Stream);
+			IntPtr attrList = gks_attribute_list_new ();
+			foreach (string key in atts.Keys) {
+				if (atts[key] is string) {
+					gnome_keyring_attribute_list_append_string (attrList, key, (string)atts[key]);
+				} else if (atts[key] is int) {
+					gnome_keyring_attribute_list_append_uint32 (attrList, key, (uint)((int)atts[key]));
+				} else {
+					throw new ArgumentException (String.Format ("Attribute \"{0}\" has invalid parameter type: {1}", key, atts[key].GetType ()));
+				}
+			}
+			
+			ResultCode result = gnome_keyring_item_set_attributes_sync (keyring, (uint)id, attrList);
+			
+			gnome_keyring_attribute_list_free (attrList);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
 		}
 
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_get_info_sync (string keyringName, out IntPtr keyringInfo);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern void gnome_keyring_info_free (IntPtr keyringInfo);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern IntPtr gnome_keyring_info_get_ctime (IntPtr keyringInfo);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern IntPtr gnome_keyring_info_get_mtime (IntPtr keyringInfo);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern int gnome_keyring_info_get_lock_timeout (IntPtr keyringInfo);
+		[DllImport("libgnome-keyring.dll")]
+		static extern bool gnome_keyring_info_get_is_locked (IntPtr keyringInfo);
+		[DllImport("libgnome-keyring.dll")]
+		static extern bool gnome_keyring_info_get_lock_on_idle (IntPtr keyringInfo);
+		
 		public static KeyringInfo GetKeyringInfo (string keyring)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.GetKeyringInfo, keyring);
-			ResponseMessage resp = SendRequest (req.Stream);
-			return new KeyringInfo (keyring, (resp.GetInt32 () != 0),
-							resp.GetInt32 (),
-							resp.GetDateTime (),
-							resp.GetDateTime (),
-							(resp.GetInt32 () != 0));
+			IntPtr keyring_info = IntPtr.Zero;
+			ResultCode result = gnome_keyring_get_info_sync (keyring, out keyring_info);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			
+			DateTime ctime = GLib.Marshaller.time_tToDateTime (gnome_keyring_info_get_ctime (keyring_info));
+			DateTime mtime = GLib.Marshaller.time_tToDateTime (gnome_keyring_info_get_mtime (keyring_info));
+			KeyringInfo retval = new KeyringInfo (keyring,
+				gnome_keyring_info_get_lock_on_idle (keyring_info),
+				gnome_keyring_info_get_lock_timeout (keyring_info),
+				mtime,
+				ctime,
+				gnome_keyring_info_get_is_locked (keyring_info)
+				);
+			
+			
+			gnome_keyring_info_free (keyring_info);
+			return retval;
 		}
+		
+		[DllImport ("libgnome-keyring.dll")]
+		static extern ResultCode gnome_keyring_set_info_sync (string keyring, IntPtr keyringInfo);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern void gnome_keyring_info_set_lock_timeout (IntPtr keyringInfo, UInt32 timeout);
+		[DllImport ("libgnome-keyring.dll")]
+		static extern void gnome_keyring_info_set_lock_on_idle (IntPtr keyringInfo, bool lockOnIdle);
 
 		public static void SetKeyringInfo (string keyring, KeyringInfo info)
 		{
@@ -469,41 +652,47 @@
 			if (info == null)
 				throw new ArgumentNullException ("info");
 
-			RequestMessage req = new RequestMessage ();
-			req.StartOperation (Operation.SetKeyringInfo);
-			req.Write (keyring);
-			req.Write (info.LockOnIdle ? 1 : 0);
-			req.Write (info.LockTimeoutSeconds);
-			req.EndOperation ();
-			SendRequest (req.Stream);
+		
+			IntPtr keyring_info;
+			ResultCode result = gnome_keyring_get_info_sync (keyring, out keyring_info);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
+			
+			gnome_keyring_info_set_lock_timeout (keyring_info, (uint)info.LockTimeoutSeconds);
+			gnome_keyring_info_set_lock_on_idle (keyring_info, info.LockOnIdle);
+			
+			result = gnome_keyring_set_info_sync (keyring, keyring_info);
+
+			gnome_keyring_info_free (keyring_info);
+			
+			if (result != ResultCode.Ok) {
+				throw new KeyringException (result);
+			}
 		}
 
+		[Obsolete ("Item ACLs are deprecated.  GetItemACL never returns any ACLs")]
 		public static ArrayList GetItemACL (string keyring, int id)
 		{
 			if (keyring == null)
 				throw new ArgumentNullException ("keyring");
 
-			RequestMessage req = new RequestMessage ();
-			req.CreateSimpleOperation (Operation.GetItemACL, keyring, id);
-			ResponseMessage resp = SendRequest (req.Stream);
-			int count = resp.GetInt32 ();
-			ArrayList list = new ArrayList (count);
-			for (int i = 0; i < count; i++) {
-				list.Add (new ItemACL (resp.GetString (), resp.GetString (), (AccessRights) resp.GetInt32 ()));
-			}
-			return list;
+			return new ArrayList ();
 		}
 
+		[Obsolete("Item ACLs are deprecated.  SetItemACL has no effect.")]
 		public static void SetItemACL (string keyring, int id, ICollection acls)
 		{
 			if (acls == null)
 				throw new ArgumentNullException ("acls");
 
-			ItemACL [] arr = new ItemACL [acls.Count];
+			ItemACL[] arr = new ItemACL[acls.Count];
 			acls.CopyTo (arr, 0);
 			SetItemACL (keyring, id, arr);
 		}
-
+		
+		[Obsolete("Item ACLs are deprecated.  SetItemACL has no effect.")]
 		public static void SetItemACL (string keyring, int id, ItemACL [] acls)
 		{
 			if (keyring == null)
@@ -514,28 +703,6 @@
 
 			if (acls.Length == 0)
 				throw new ArgumentException ("Empty ACL set.", "acls");
-
-			RequestMessage req = new RequestMessage ();
-			req.StartOperation (Operation.SetItemACL);
-			req.Write (keyring);
-			req.Write (id);
-			req.Write (acls.Length);
-			foreach (ItemACL acl in acls) {
-				req.Write (acl.DisplayName);
-				req.Write (acl.FullPath);
-				req.Write ((int) acl.Access);
-			}
-			req.EndOperation ();
-			SendRequest (req.Stream);
 		}
 	}
-
-#if WITH_DBUS
-	[Interface ("org.gnome.keyring.Daemon")]
-	interface IDaemon
-	{
-		string GetSocketPath ();
-	}
-#endif
 }
-

=== modified file 'src/Makefile.am'
--- src/Makefile.am	2007-10-16 22:46:31 +0000
+++ src/Makefile.am	2010-03-30 05:11:26 +0000
@@ -5,13 +5,13 @@
 SNK=$(ASSEMBLY_NAME).snk
 
 pkgconfigdir=$(libdir)/pkgconfig
-CSFLAGS+= -debug+ -debug:full -nologo -r:Mono.Posix.dll
+CSFLAGS += -debug+ -debug:full -nologo -r:Mono.Posix.dll
 
 pkgconfig_DATA = gnome-keyring-sharp-1.0.pc
 
-CLEANFILES = $(ASSEMBLY_NAME).*
+CLEANFILES = $(ASSEMBLY_NAME).dll $(ASSEMBLY_NAME).dll.mdb $(ASSEMBLY_NAME).snk
 
-gnomekeyring_references = $(DBUS_LIBS)
+gnomekeyring_references = $(GLIB_SHARP_LIBS)
 
 gnomekeyring_sources  = \
 			Gnome.Keyring/AccessRights.cs \
@@ -24,9 +24,6 @@
 			Gnome.Keyring/KeyringInfo.cs \
 			Gnome.Keyring/NetItemData.cs \
 			Gnome.Keyring/NoteItemData.cs \
-			Gnome.Keyring/Operation.cs \
-			Gnome.Keyring/RequestMessage.cs \
-			Gnome.Keyring/ResponseMessage.cs \
 			Gnome.Keyring/ResultCode.cs \
 			Gnome.Keyring/Ring.cs
 
@@ -50,3 +47,4 @@
 	echo "$(GACUTIL) /u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS)"; \
 	$(GACUTIL) /u $(ASSEMBLY_NAME) /package $(PACKAGE)-$(API_VERSION) $(GACUTIL_FLAGS) || exit 1;
 
+EXTRA_DIST=Gnome.Keyring.dll.config