2006-02-20 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaException.cs
1 //\r
2 // XmlSchemaException.cs\r
3 //\r
4 // Author:\r
5 //      Dwivedi, Ajay kumar Adwiv@Yahoo.com\r
6 //      Enomoto, Atsushi atsushi@ximian.com\r
7 //\r
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 using System.Globalization;\r
31 using System.Runtime.Serialization;\r
32 using System.Security.Permissions;\r
33 \r
34 namespace System.Xml.Schema\r
35 {\r
36         /// <summary>\r
37         /// Summary description for XmlSchemaException.\r
38         /// </summary>\r
39         [Serializable]\r
40         public class XmlSchemaException : System.SystemException\r
41         {\r
42                 //fields\r
43                 private bool hasLineInfo;\r
44                 private int lineNumber;\r
45                 private int linePosition;\r
46                 private XmlSchemaObject sourceObj;\r
47                 private string sourceUri;\r
48 \r
49 #if NET_2_0\r
50                 public XmlSchemaException ()\r
51                         : this ("A schema error occured.", null)\r
52                 {\r
53                 }\r
54 \r
55                 public XmlSchemaException (string message)\r
56                         : this (message, null)\r
57                 {\r
58                 }\r
59 #endif\r
60 \r
61                 protected XmlSchemaException(SerializationInfo info, StreamingContext context)\r
62                         : base (info, context)\r
63                 {\r
64                         this.hasLineInfo = info.GetBoolean ("hasLineInfo");\r
65                         this.lineNumber = info.GetInt32 ("lineNumber");\r
66                         this.linePosition = info.GetInt32 ("linePosition");\r
67                         this.sourceUri = info.GetString ("sourceUri");\r
68                         this.sourceObj = info.GetValue ("sourceObj", typeof (XmlSchemaObject)) as XmlSchemaObject;\r
69                 }\r
70 \r
71 #if NET_2_0\r
72                 public XmlSchemaException (string message, Exception innerException, int lineNumber, int linePosition)\r
73                         : this (message, lineNumber, linePosition, null, null, innerException)\r
74                 {\r
75                 }\r
76 #endif\r
77 \r
78                 internal XmlSchemaException (string message, int lineNumber, int linePosition,\r
79                         XmlSchemaObject sourceObject, string sourceUri, Exception innerException)\r
80                         : base (\r
81                                 GetMessage (message, sourceUri, lineNumber, linePosition, sourceObject),\r
82                                 innerException)\r
83                 {\r
84                         hasLineInfo = true;\r
85                         this.lineNumber         = lineNumber;\r
86                         this.linePosition       = linePosition;\r
87                         this.sourceObj          = sourceObject;\r
88                         this.sourceUri          = sourceUri;\r
89                 }\r
90 \r
91                 internal XmlSchemaException (string message, object sender,\r
92                         string sourceUri, XmlSchemaObject sourceObject, Exception innerException)\r
93                         : base (GetMessage (message, sourceUri, sender, sourceObject), innerException)\r
94                 {\r
95                         IXmlLineInfo li = sender as IXmlLineInfo;\r
96                         if (li != null && li.HasLineInfo ()) {\r
97                                 hasLineInfo = true;\r
98                                 this.lineNumber = li.LineNumber;\r
99                                 this.linePosition = li.LinePosition;\r
100                         }\r
101                         this.sourceObj = sourceObject;\r
102                 }\r
103 \r
104                 internal XmlSchemaException(string message, XmlSchemaObject sourceObject,\r
105                         Exception innerException)\r
106                         : base (\r
107                                 GetMessage (message, null, 0, 0, sourceObject),\r
108                                 innerException)\r
109                 {\r
110                         hasLineInfo = true;\r
111                         this.lineNumber = sourceObject.LineNumber;\r
112                         this.linePosition = sourceObject.LinePosition;\r
113                         this.sourceObj  =       sourceObject;\r
114                         this.sourceUri  =       sourceObject.SourceUri;\r
115                 }\r
116 \r
117                 public XmlSchemaException(string message, Exception innerException)\r
118                         : base (\r
119                                 GetMessage (message, null, 0, 0, null),\r
120                                 innerException )\r
121                 {\r
122                 }\r
123 \r
124                 // Properties\r
125                 public int LineNumber\r
126                 { \r
127                         get{ return this.lineNumber;} \r
128                 }\r
129                 public int LinePosition \r
130                 { \r
131                         get{ return this.linePosition;} \r
132                 }\r
133                 public XmlSchemaObject SourceSchemaObject \r
134                 {\r
135                         get{ return this.sourceObj; } \r
136                 }\r
137                 public string SourceUri \r
138                 { \r
139                         get{ return this.sourceUri; } \r
140                 }\r
141 \r
142                 private static string GetMessage (string message, string sourceUri, object sender, XmlSchemaObject sourceObj)\r
143                 {\r
144                         IXmlLineInfo li = sender as IXmlLineInfo;\r
145                         if (li == null)\r
146                                 return GetMessage (message, sourceUri, 0, 0, sourceObj);\r
147                         else\r
148                                 return GetMessage (message, sourceUri, li.LineNumber, li.LinePosition, sourceObj);\r
149                 }\r
150 \r
151                 private static string GetMessage (string message, string sourceUri, int lineNumber, int linePosition, XmlSchemaObject sourceObj)\r
152                 {\r
153                         string msg = "XmlSchema error: " + message;\r
154                         if (lineNumber > 0)\r
155                                 msg += String.Format (CultureInfo.InvariantCulture, " XML {0} Line {1}, Position {2}.",\r
156                                         (sourceUri != null && sourceUri != "") ? "URI: " + sourceUri + " ." : "",\r
157                                         lineNumber,\r
158                                         linePosition);\r
159                         if (sourceObj != null)\r
160                                 msg += String.Format (CultureInfo.InvariantCulture, " Related schema item SourceUri: {0}, Line {1}, Position {2}.",\r
161                                         sourceObj.SourceUri, sourceObj.LineNumber, sourceObj.LinePosition);\r
162                         return msg;\r
163                 }\r
164 \r
165                 public override string Message {\r
166                         get { return base.Message; }\r
167                 }\r
168 \r
169                 // Methods\r
170
171                 [SecurityPermission (SecurityAction.Demand, SerializationFormatter = true)]
172                 public override void GetObjectData(SerializationInfo info, StreamingContext context)\r
173                 {\r
174                         base.GetObjectData (info, context);\r
175                         info.AddValue ("hasLineInfo", hasLineInfo);\r
176                         info.AddValue ("lineNumber", lineNumber);\r
177                         info.AddValue ("linePosition", linePosition);\r
178                         info.AddValue ("sourceUri", sourceUri);\r
179                         info.AddValue ("sourceObj", sourceObj);\r
180                 }\r
181         }\r
182 }\r