start of refactoring work on X backend. this is nowhere near usable yet.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms.X11Internal / X11Exception.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2006 Novell, Inc. (http://www.novell.com)
21 //
22 //
23
24 using System;
25 using System.Text;
26 using System.Threading;
27 using System.Windows.Forms;
28
29 namespace System.Windows.Forms.X11Internal {
30
31         internal class X11Exception : ApplicationException {
32                 IntPtr          Display;
33                 IntPtr          ResourceID;
34                 IntPtr          Serial;
35                 XRequest        RequestCode;
36                 byte            ErrorCode;
37                 byte            MinorCode;
38
39                 public X11Exception (IntPtr Display, IntPtr ResourceID, IntPtr Serial, byte ErrorCode, XRequest RequestCode, byte MinorCode)
40                 {
41                         this.Display = Display;
42                         this.ResourceID = ResourceID;
43                         this.Serial = Serial;
44                         this.RequestCode = RequestCode;
45                         this.ErrorCode = ErrorCode;
46                         this.MinorCode = MinorCode;
47                 }
48
49                 public override string Message {
50                         get {
51                                 return GetMessage (Display, ResourceID, Serial, ErrorCode, RequestCode, MinorCode);
52                         }
53                 }
54
55                 public static string GetMessage (IntPtr Display, IntPtr ResourceID, IntPtr Serial, byte ErrorCode, XRequest RequestCode, byte MinorCode)
56                 {
57                         StringBuilder   sb;
58                         string          x_error_text;
59                         string          error;
60                         string          hwnd_text;
61                         string          control_text;
62                         Hwnd            hwnd;
63                         Control         c;
64
65                         sb = new StringBuilder(160);
66                         Xlib.XGetErrorText (Display, ErrorCode, sb, sb.Capacity);
67                         x_error_text = sb.ToString();
68                         hwnd = Hwnd.ObjectFromHandle(ResourceID);
69                         if (hwnd != null) {
70                                 hwnd_text = hwnd.ToString();
71                                 c = Control.FromHandle(hwnd.Handle);
72                                 if (c != null) {
73                                         control_text = c.ToString();
74                                 } else {
75                                         control_text = String.Format("<handle {0:X} non-existant>", hwnd.Handle);
76                                 }
77                         }
78                         else {
79                                 hwnd_text = "<null>";
80                                 control_text = "<null>";
81                         }
82
83                         error = String.Format("\n  Error: {0}\n  Request:     {1:D} ({2})\n  Resource ID: 0x{3:X}\n  Serial:      {4}\n  Hwnd:        {5}\n  Control:     {6}", x_error_text, RequestCode, RequestCode, ResourceID.ToInt32(), Serial, hwnd_text, control_text);
84                         return error;
85                 }
86         }
87 }