1 using System;
2 using System.Collections;
3 using System.Runtime.InteropServices;
4 
5 namespace GMime {
6 
7 	public class InternetAddressList : ArrayList, IDisposable {
8 		private IntPtr raw_list;
9 		private bool needs_destroy;
10 
11 		[DllImport("gmime")]
internet_address_list_next(IntPtr raw)12 		static extern IntPtr internet_address_list_next (IntPtr raw);
13 
14 		[DllImport("gmime")]
internet_address_list_get_address(IntPtr raw)15 		static extern IntPtr internet_address_list_get_address (IntPtr raw);
16 
17 		[DllImport("gmime")]
internet_address_list_destroy(IntPtr raw)18 		static extern void internet_address_list_destroy (IntPtr raw);
19 
InternetAddressList(IntPtr raw_list, bool needs_destroy)20 		public InternetAddressList (IntPtr raw_list, bool needs_destroy)
21 			{
22 				this.raw_list = raw_list;
23 				this.needs_destroy = needs_destroy;
24 
25 				while (raw_list != IntPtr.Zero) {
26 					IntPtr raw_ia = internet_address_list_get_address (raw_list);
27 
28 					InternetAddress addr = new InternetAddress (raw_ia);
29 					this.Add (addr);
30 
31 					raw_list = internet_address_list_next (raw_list);
32 				}
33 			}
34 
InternetAddressList(IntPtr raw_list)35 		public InternetAddressList (IntPtr raw_list) : this (raw_list, false) { }
36 
~InternetAddressList()37 		~InternetAddressList ()
38 		{
39 			this.Dispose ();
40 		}
41 
Dispose()42 		public void Dispose ()
43 		{
44 			if (this.needs_destroy) {
45 				internet_address_list_destroy (this.raw_list);
46 				this.raw_list = IntPtr.Zero;
47 				this.needs_destroy = false;
48 			}
49 			GC.SuppressFinalize (this);
50 		}
51 
52 		[DllImport("gmime")]
internet_address_parse_string(string list)53 		static extern IntPtr internet_address_parse_string (string list);
54 
ParseString(string list)55 		public static InternetAddressList ParseString (string list)
56 		{
57 			IntPtr raw_ret = internet_address_parse_string (list);
58 
59 			return new InternetAddressList (raw_ret, true);
60 		}
61 	}
62 }
63