2005-04-12 Dick Porter <dick@ximian.com>
[mono.git] / mcs / class / Novell.Directory.Ldap / Novell.Directory.Ldap.Extensions / ListReplicasResponse.cs
1 /******************************************************************************
2 * The MIT License
3 * Copyright (c) 2003 Novell Inc.  www.novell.com
4
5 * Permission is hereby granted, free of charge, to any person obtaining  a copy
6 * of this software and associated documentation files (the Software), to deal
7 * in the Software without restriction, including  without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
9 * copies of the Software, and to  permit persons to whom the Software is 
10 * furnished to do so, subject to the following conditions:
11
12 * The above copyright notice and this permission notice shall be included in 
13 * all copies or substantial portions of the Software.
14
15 * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 *******************************************************************************/
23 //
24 // Novell.Directory.Ldap.Extensions.ListReplicasResponse.cs
25 //
26 // Author:
27 //   Sunil Kumar (Sunilk@novell.com)
28 //
29 // (C) 2003 Novell, Inc (http://www.novell.com)
30 //
31
32 using System;
33 using Novell.Directory.Ldap;
34 using Novell.Directory.Ldap.Asn1;
35 using Novell.Directory.Ldap.Utilclass;
36 using Novell.Directory.Ldap.Rfc2251;
37
38 namespace Novell.Directory.Ldap.Extensions
39 {
40         
41         /// <summary> Retrieves the list of replicas from the specified server.
42         /// 
43         /// An object in this class is generated from an ExtendedResponse object
44         /// using the ExtendedResponseFactory class.
45         /// 
46         /// The listReplicaResponse extension uses the following OID:
47         /// 2.16.840.1.113719.1.27.20
48         /// 
49         /// </summary>
50         public class ListReplicasResponse:LdapExtendedResponse
51         {
52                 /// <summary> Returns a list of distinguished names for the replicas on the server.
53                 /// 
54                 /// </summary>
55                 /// <returns> String value specifying the identity returned by the server
56                 /// </returns>
57                 virtual public System.String[] ReplicaList
58                 {
59                         get
60                         {
61                                 return replicaList;
62                         }
63                         
64                 }
65                 
66                 // Identity returned by the server
67                 private System.String[] replicaList;
68                 
69                 /// <summary> Constructs an object from the responseValue which contains the list
70                 /// of replicas.
71                 /// 
72                 /// The constructor parses the responseValue which has the following
73                 /// format:
74                 /// responseValue ::=
75                 ///   replicaList
76                 /// SEQUENCE OF OCTET STRINGS
77                 /// 
78                 /// </summary>
79                 /// <exception> IOException  The responseValue could not be decoded.
80                 /// </exception>
81                 public ListReplicasResponse(RfcLdapMessage rfcMessage):base(rfcMessage)
82                 {
83                         
84                         if (ResultCode != LdapException.SUCCESS)
85                         {
86                                 replicaList = new System.String[0];
87                         }
88                         else
89                         {
90                                 // parse the contents of the reply
91                                 sbyte[] returnedValue = this.Value;
92                                 if (returnedValue == null)
93                                         throw new System.IO.IOException("No returned value");
94                                 
95                                 // Create a decoder object
96                                 LBERDecoder decoder = new LBERDecoder();
97                                 if (decoder == null)
98                                         throw new System.IO.IOException("Decoding error");
99                                 
100                                 // We should get back a sequence
101                                 Asn1Sequence returnedSequence = (Asn1Sequence) decoder.decode(returnedValue);
102                                 if (returnedSequence == null)
103                                         throw new System.IO.IOException("Decoding error");
104                                 
105                                 // How many replicas were returned
106                                 int len = returnedSequence.size();
107                                 replicaList = new System.String[len];
108                                 
109                                 // Copy each one into our String array
110                                 for (int i = 0; i < len; i++)
111                                 {
112                                         // Get the next Asn1Octet String in the sequence
113                                         Asn1OctetString asn1_nextReplica = (Asn1OctetString) returnedSequence.get_Renamed(i);
114                                         if (asn1_nextReplica == null)
115                                                 throw new System.IO.IOException("Decoding error");
116                                         
117                                         // Convert to a string
118                                         replicaList[i] = asn1_nextReplica.stringValue();
119                                         if ((System.Object) replicaList[i] == null)
120                                                 throw new System.IO.IOException("Decoding error");
121                                 }
122                         }
123                 }
124         }
125 }