wbemprox: Return an empty object if the path is NULL or empty.
[wine] / dlls / winemac.drv / macdrv_main.c
1 /*
2  * MACDRV initialization code
3  *
4  * Copyright 1998 Patrik Stridvall
5  * Copyright 2000 Alexandre Julliard
6  * Copyright 2011, 2012, 2013 Ken Thomases for CodeWeavers Inc.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22 #include "config.h"
23
24 #include "macdrv.h"
25 #include "wine/server.h"
26
27 WINE_DEFAULT_DEBUG_CHANNEL(macdrv);
28
29
30 DWORD thread_data_tls_index = TLS_OUT_OF_INDEXES;
31
32
33 /***********************************************************************
34  *              process_attach
35  */
36 static BOOL process_attach(void)
37 {
38     assert(NUM_EVENT_TYPES <= sizeof(macdrv_event_mask) * 8);
39
40     if ((thread_data_tls_index = TlsAlloc()) == TLS_OUT_OF_INDEXES) return FALSE;
41
42     macdrv_err_on = ERR_ON(macdrv);
43     if (macdrv_start_cocoa_app(GetTickCount64()))
44     {
45         ERR("Failed to start Cocoa app main loop\n");
46         return FALSE;
47     }
48
49     return TRUE;
50 }
51
52
53 /***********************************************************************
54  *              thread_detach
55  */
56 static void thread_detach(void)
57 {
58     struct macdrv_thread_data *data = macdrv_thread_data();
59
60     if (data)
61     {
62         macdrv_destroy_event_queue(data->queue);
63         HeapFree(GetProcessHeap(), 0, data);
64     }
65 }
66
67
68 /***********************************************************************
69  *              set_queue_display_fd
70  *
71  * Store the event queue fd into the message queue
72  */
73 static void set_queue_display_fd(int fd)
74 {
75     HANDLE handle;
76     int ret;
77
78     if (wine_server_fd_to_handle(fd, GENERIC_READ | SYNCHRONIZE, 0, &handle))
79     {
80         MESSAGE("macdrv: Can't allocate handle for event queue fd\n");
81         ExitProcess(1);
82     }
83     SERVER_START_REQ(set_queue_fd)
84     {
85         req->handle = wine_server_obj_handle(handle);
86         ret = wine_server_call(req);
87     }
88     SERVER_END_REQ;
89     if (ret)
90     {
91         MESSAGE("macdrv: Can't store handle for event queue fd\n");
92         ExitProcess(1);
93     }
94     CloseHandle(handle);
95 }
96
97
98 /***********************************************************************
99  *              macdrv_init_thread_data
100  */
101 struct macdrv_thread_data *macdrv_init_thread_data(void)
102 {
103     struct macdrv_thread_data *data = macdrv_thread_data();
104
105     if (data) return data;
106
107     if (!(data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data))))
108     {
109         ERR("could not create data\n");
110         ExitProcess(1);
111     }
112
113     if (!(data->queue = macdrv_create_event_queue()))
114     {
115         ERR("macdrv: Can't create event queue.\n");
116         ExitProcess(1);
117     }
118
119     set_queue_display_fd(macdrv_get_event_queue_fd(data->queue));
120     TlsSetValue(thread_data_tls_index, data);
121
122     return data;
123 }
124
125
126 /***********************************************************************
127  *              DllMain
128  */
129 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved)
130 {
131     BOOL ret = TRUE;
132
133     switch(reason)
134     {
135     case DLL_PROCESS_ATTACH:
136         ret = process_attach();
137         break;
138     case DLL_THREAD_DETACH:
139         thread_detach();
140         break;
141     }
142     return ret;
143 }