Bump cecil
[mono-project.git] / support / supportw.c
blob247f310c23b95a26c7fd1ae7460fe672766ab1a6
1 /*
2 * Helper routines for some of the common methods that people P/Invoke
3 * on their applications.
5 * Authors:
6 * Gonzalo Paniagua (gonzalo@ximian.com)
7 * Miguel de Icaza (miguel@novell.com)
9 * (C) 2005 Novell, Inc.
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"
22 typedef struct {
23 const char *fname;
24 void *fnptr;
25 } FnPtr;
27 gpointer FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter,
28 const char *classw, const char *window);
30 gpointer GetProcessHeap (void);
32 static FnPtr functions [] = {
33 { "FindWindowExW", NULL }, /* user32 */
35 #define NFUNCTIONS (sizeof (functions)/sizeof (FnPtr))
37 static int swf_registered;
39 static int
40 compare_names (const void *key, const void *p)
42 FnPtr *ptr = (FnPtr *) p;
43 return strcmp (key, ptr->fname);
46 static gpointer
47 get_function (const char *name)
49 FnPtr *ptr;
51 ptr = bsearch (name, functions, NFUNCTIONS, sizeof (FnPtr),
52 compare_names);
54 if (ptr == NULL) {
55 g_warning ("Function '%s' not not found.", name);
56 return NULL;
59 return ptr->fnptr;
62 gboolean
63 supportw_register_delegate (const char *function_name, void *fnptr)
65 FnPtr *ptr;
67 g_return_val_if_fail (function_name && fnptr, FALSE);
69 ptr = bsearch (function_name, functions, NFUNCTIONS, sizeof (FnPtr),
70 compare_names);
72 if (ptr == NULL) {
73 g_warning ("Function '%s' not supported.", function_name);
74 return FALSE;
77 ptr->fnptr = fnptr;
78 return TRUE;
81 #define M_ATTRS (METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC)
82 static gboolean
83 register_assembly (const char *name, int *registered)
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;
94 if (*registered)
95 return TRUE;
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;
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;
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;
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;
125 *registered = 1;
126 mono_assembly_close (assembly);
127 return TRUE;
128 #else
129 return FALSE;
130 #endif
133 void
134 supportw_test_all ()
136 int i;
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);
146 gpointer
147 FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter, const char *classw, const char *window)
149 typedef gpointer (*func_type) (gpointer hwndParent, gpointer hwndChildAfter,
150 const char *classw, const char *window);
151 static func_type func;
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");
157 return func (hwndParent, hwndChildAfter, classw, window);
161 SetWindowPos (gpointer hwnd, gpointer hwndInsertAfter, int x, int y, int cx, int cy, unsigned int flags);
164 SetWindowPos (gpointer hwnd, gpointer hwndInsertAfter, int x, int y, int cx, int cy, unsigned int flags)
166 fprintf (stderr, "SetWindowPos %p %p to [%d,%dx%d,%d] %d\n", hwnd, hwndInsertAfter, x, y, cx, cy, flags);
167 return 1;
171 SendMessageA (gpointer hwnd, unsigned int msg, gpointer wparam, gpointer lparam);
174 SendMessageA (gpointer hwnd, unsigned int msg, gpointer wparam, gpointer lparam)
176 fprintf (stderr, "SendMessage (%d, 0x%x, %p, %p)\n", (int) GPOINTER_TO_INT (hwnd), msg, wparam, lparam);
177 return 0;
181 GetWindowLongA (gpointer hwnd, int a);
184 GetWindowLongA (gpointer hwnd, int a)
186 return 0;