Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / support / supportw.c
1 /*
2  * Helper routines for some of the common methods that people P/Invoke
3  * on their applications.
4  *
5  * Authors:
6  *   Gonzalo Paniagua (gonzalo@ximian.com)
7  *   Miguel de Icaza  (miguel@novell.com)
8  *
9  * (C) 2005 Novell, Inc.
10  *
11  */
12 #include <glib.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <unistd.h>
16 #include "supportw.h"
17 #include "mono/metadata/assembly.h"
18 #include "mono/metadata/class.h"
19 #include "mono/metadata/object.h"
20 #include "mono/metadata/tabledefs.h"
21
22 typedef struct {
23         const char *fname;
24         void *fnptr;
25 } FnPtr;
26
27 gpointer FindWindowExW        (gpointer hwndParent, gpointer hwndChildAfter,
28                                const char *classw, const char *window);
29
30 gpointer GetProcessHeap       (void);
31
32 static FnPtr functions [] = {
33         { "FindWindowExW", NULL }, /* user32 */
34 };
35 #define NFUNCTIONS      (sizeof (functions)/sizeof (FnPtr))
36
37 static int swf_registered;
38
39 static int
40 compare_names (const void *key, const void *p)
41 {
42         FnPtr *ptr = (FnPtr *) p;
43         return strcmp (key, ptr->fname);
44 }
45
46 static gpointer
47 get_function (const char *name)
48 {
49         FnPtr *ptr;
50
51         ptr = bsearch (name, functions, NFUNCTIONS, sizeof (FnPtr),
52                         compare_names);
53
54         if (ptr == NULL) {
55                 g_warning ("Function '%s' not found.", name);
56                 return NULL;
57         }
58
59         return ptr->fnptr;
60 }
61
62 gboolean
63 supportw_register_delegate (const char *function_name, void *fnptr)
64 {
65         FnPtr *ptr;
66
67         g_return_val_if_fail (function_name && fnptr, FALSE);
68
69         ptr = bsearch (function_name, functions, NFUNCTIONS, sizeof (FnPtr),
70                         compare_names);
71
72         if (ptr == NULL) {
73                 g_warning ("Function '%s' not supported.", function_name);
74                 return FALSE;
75         }
76
77         ptr->fnptr = fnptr;
78         return TRUE;
79 }
80
81 #define M_ATTRS (METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC)
82 static gboolean
83 register_assembly (const char *name, int *registered)
84 {
85 /* we can't use mono or wapi funcions in a support lib */
86 #if 0
87         MonoAssembly *assembly;
88         MonoImageOpenStatus status;
89         MonoImage *image;
90         MonoClass *klass;
91         MonoMethod *method;
92         MonoObject *exc;
93
94         if (*registered)
95                 return TRUE;
96
97         assembly = mono_assembly_load_with_partial_name (name, &status);
98         if (assembly == NULL) {
99                 g_warning ("Cannot load assembly '%s'.", name);
100                 return FALSE;
101         }
102
103         image = mono_assembly_get_image (assembly);
104         klass = mono_class_from_name (image, name, "LibSupport");
105         if (klass == NULL) {
106                 g_warning ("Cannot load class %s.LibSupport", name);
107                 mono_assembly_close (assembly);
108                 return FALSE;
109         }
110
111         method = mono_class_get_method_from_name_flags (klass, "Register", 0, M_ATTRS);
112         if (klass == NULL) {
113                 g_warning ("Cannot load method Register from klass %s.LibSupport", name);
114                 mono_assembly_close (assembly);
115                 return FALSE;
116         }
117
118         exc = NULL;
119         mono_runtime_invoke (method, NULL, NULL, &exc);
120         if (exc != NULL) {
121                 mono_assembly_close (assembly);
122                 mono_print_unhandled_exception (exc);
123                 return FALSE;
124         }
125         *registered = 1;
126         mono_assembly_close (assembly);
127         return TRUE;
128 #else
129         return FALSE;
130 #endif
131 }
132
133 void
134 supportw_test_all ()
135 {
136         int i;
137
138         register_assembly ("System.Windows.Forms", &swf_registered);
139         for (i = 0; i < NFUNCTIONS; i++) {
140                 FnPtr *ptr = &functions [i];
141                 if (ptr->fnptr == NULL)
142                         g_warning ("%s wasn't registered.", ptr->fname);
143         }
144 }
145
146 gpointer
147 FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter, const char *classw, const char *window)
148 {
149         typedef gpointer (*func_type) (gpointer hwndParent, gpointer hwndChildAfter,
150                                         const char *classw, const char *window);
151         static func_type func;
152
153         g_return_val_if_fail (register_assembly ("System.Windows.Forms", &swf_registered), NULL);
154         if (func == NULL)
155                 func = (func_type) get_function ("FindWindowExW");
156
157         return func (hwndParent, hwndChildAfter, classw, window);
158 }
159
160 int
161 SetWindowPos (gpointer hwnd, gpointer hwndInsertAfter, int x, int y, int cx, int cy, unsigned int flags);
162
163 int
164 SetWindowPos (gpointer hwnd, gpointer hwndInsertAfter, int x, int y, int cx, int cy, unsigned int flags)
165 {
166         fprintf (stderr, "SetWindowPos %p %p to [%d,%dx%d,%d] %d\n", hwnd, hwndInsertAfter, x, y, cx, cy, flags);
167         return 1;
168 }
169
170 int
171 SendMessageA (gpointer hwnd, unsigned int msg, gpointer wparam, gpointer lparam);
172
173 int
174 SendMessageA (gpointer hwnd, unsigned int msg, gpointer wparam, gpointer lparam)
175 {
176         fprintf (stderr, "SendMessage (%d, 0x%x, %p, %p)\n", (int) GPOINTER_TO_INT (hwnd), msg, wparam, lparam);
177         return 0;
178 }
179
180 int
181 GetWindowLongA (gpointer hwnd, int a);
182
183 int
184 GetWindowLongA (gpointer hwnd, int a)
185 {
186         return 0;
187 }