]> git.sesse.net Git - vlc/blob - bindings/cil/src/exception.cs
Start rewriting the CIL bindings
[vlc] / bindings / cil / src / exception.cs
1 /**
2  * @file exception.cs
3  * @brief LibVLC exceptions
4  * @ingroup API
5  */
6
7 /**********************************************************************
8  *  Copyright (C) 2007-2009 RĂ©mi Denis-Courmont.                      *
9  *  This program is free software; you can redistribute and/or modify *
10  *  it under the terms of the GNU General Public License as published *
11  *  by the Free Software Foundation; version 2 of the license, or (at *
12  *  your option) any later version.                                   *
13  *                                                                    *
14  *  This program is distributed in the hope that it will be useful,   *
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of    *
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.              *
17  *  See the GNU General Public License for more details.              *
18  *                                                                    *
19  *  You should have received a copy of the GNU General Public License *
20  *  along with this program; if not, you can get it from:             *
21  *  http://www.gnu.org/copyleft/gpl.html                              *
22  **********************************************************************/
23
24 using System;
25 using System.Runtime.InteropServices;
26
27 namespace VideoLAN.LibVLC
28 {
29     /**
30      * @brief VLCException: base class for LibVLC exceptions
31      * @ingroup API
32      */
33     public class VLCException : Exception
34     {
35         /**
36          * Creates a managed VLC exception.
37          */
38         public VLCException ()
39         {
40         }
41
42         /**
43          * Creates a managed VLC exception.
44          * @param message exception error message
45          */
46         public VLCException (string message)
47             : base (message)
48         {
49         }
50
51         /**
52          * Creates a managed VLC exception wrapping another exception.
53          * @param message exception error message
54          * @param inner inner wrapped exception
55          */
56         public VLCException (string message, Exception inner)
57            : base (message, inner)
58         {
59         }
60     };
61
62     /**
63      * @section Internals
64      */
65
66     /**
67      * libvlc_exception_t: structure for unmanaged LibVLC exceptions
68      */
69     [StructLayout (LayoutKind.Sequential)]
70     public sealed class NativeException : IDisposable
71     {
72         int raised;
73         int code;
74         IntPtr message;
75
76         [DllImport ("libvlc.dll", EntryPoint="libvlc_exception_init")]
77         static extern void Init (NativeException e);
78         [DllImport ("libvlc.dll", EntryPoint="libvlc_exception_clear")]
79         static extern void Clear (NativeException e);
80         /*[DllImport ("libvlc.dll",
81                     EntryPoint="libvlc_exception_raised")]
82         static extern int Raised (NativeException e);*/
83         [DllImport ("libvlc.dll",
84                     EntryPoint="libvlc_exception_get_message")]
85         static extern IntPtr GetMessage (NativeException e);
86
87         public NativeException ()
88         {
89             Init (this);
90         }
91
92         /**
93          * Throws a managed exception if LibVLC has returned a native
94          * unmanaged exception. Clears the native exception.
95          */
96         public void Raise ()
97         {
98             try
99             {
100                 string msg = U8String.FromNative (GetMessage (this));
101                 if (msg != null)
102                     throw new VLCException (msg);
103             }
104             finally
105             {
106                 Clear (this);
107             }
108         }
109
110         /** IDisposable implementation. */
111         public void Dispose ()
112         {
113             Clear (this);
114         }
115     };
116 };