4 // Copyright (C) 2005 Novell, Inc.
8 // Permission is hereby granted, free of charge, to any person obtaining a
9 // copy of this software and associated documentation files (the "Software"),
10 // to deal in the Software without restriction, including without limitation
11 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 // and/or sell copies of the Software, and to permit persons to whom the
13 // Software is furnished to do so, subject to the following conditions:
15 // The above copyright notice and this permission notice shall be included in
16 // all copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 // DEALINGS IN THE SOFTWARE.
28 using System
.Collections
;
34 namespace Beagle
.Daemon
.EvolutionDataServerQueryable
{
36 public class SourcesHandler
{
39 EvolutionDataServerQueryable queryable
;
41 SourceList source_list
;
42 Hashtable src_to_cont_map
= new Hashtable ();
44 public SourcesHandler (string gconf_key
, Type container_type
, EvolutionDataServerQueryable queryable
, string fingerprint
)
46 this.container_type
= container_type
;
47 this.queryable
= queryable
;
48 this.fingerprint
= fingerprint
;
50 // This is the first code to hit e-d-s, so we might
51 // get a DllNotFoundException exception if things
52 // aren't configured correctly. However, since
53 // we're instantiating an object, it might be
54 // wrapped in a TypeInitializationException, so
55 // catch that and rethrow the inner exception.
57 this.source_list
= new SourceList (gconf_key
);
58 } catch (TypeInitializationException ex
) {
59 throw ex
.InnerException
;
62 if (this.source_list
== null) {
63 // FIXME: We may want to watch for the creation
64 // of the sources GConf key
65 Logger
.Log
.Info ("No sources found at {0}", gconf_key
);
69 this.source_list
.GroupAdded
+= OnGroupAdded
;
70 this.source_list
.GroupRemoved
+= OnGroupRemoved
;
72 foreach (SourceGroup
group in this.source_list
.Groups
)
73 IndexSourceGroup (group, false);
76 private void IndexSourceGroup (SourceGroup
group, bool all_items
)
78 group.SourceAdded
+= OnSourceAdded
;
79 group.SourceRemoved
+= OnSourceRemoved
;
81 foreach (Evolution
.Source src
in group.Sources
) {
82 Container cont
= (Container
) Activator
.CreateInstance (this.container_type
, new object[] { src, this.queryable, this.fingerprint }
);
83 if (!cont
.OpenClient ())
86 src_to_cont_map
[src
] = cont
;
97 private void RemoveSourceGroup (SourceGroup
group)
99 foreach (Evolution
.Source src
in group.Sources
) {
100 Container cont
= (Container
) src_to_cont_map
[src
];
102 src_to_cont_map
.Remove (src
);
106 private void OnGroupAdded (object o
, GroupAddedArgs args
)
108 IndexSourceGroup (args
.Group
, true);
111 private void OnGroupRemoved (object o
, GroupRemovedArgs args
)
113 RemoveSourceGroup (args
.Group
);
116 private void OnSourceAdded (object o
, SourceAddedArgs args
)
118 Container cont
= (Container
) Activator
.CreateInstance (this.container_type
, new object[] { args.Source, this.queryable, this.fingerprint }
);
119 if (!cont
.OpenClient ())
125 private void OnSourceRemoved (object o
, SourceRemovedArgs args
)
127 Container cont
= (Container
) src_to_cont_map
[args
.Source
];