ReactOS  0.4.14-dev-77-gd9e7c48
handle.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Hans Leidekker for CodeWeavers
3  *
4  * Based on the handle implementation from wininet.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include "config.h"
22 #include "wine/port.h"
23 #include "wine/debug.h"
24 
25 #include <stdarg.h>
26 
27 #include "windef.h"
28 #include "winbase.h"
29 #include "winhttp.h"
30 
31 #include "winhttp_private.h"
32 
34 
35 #define HANDLE_CHUNK_SIZE 0x10
36 
39 {
40  0, 0, &handle_cs,
42  0, 0, { (ULONG_PTR)(__FILE__ ": handle_cs") }
43 };
44 static CRITICAL_SECTION handle_cs = { &handle_cs_debug, -1, 0, 0, 0, 0 };
45 
49 
51 {
52  ULONG refs = InterlockedIncrement( &hdr->refs );
53  TRACE("%p -> refcount = %d\n", hdr, refs);
54  return hdr;
55 }
56 
58 {
60  ULONG_PTR handle = (ULONG_PTR)hinternet;
61 
63 
64  if ((handle > 0) && (handle <= max_handles) && handles[handle - 1])
65  hdr = addref_object( handles[handle - 1] );
66 
68 
69  TRACE("handle 0x%lx -> %p\n", handle, hdr);
70  return hdr;
71 }
72 
74 {
75  ULONG refs = InterlockedDecrement( &hdr->refs );
76  TRACE("object %p refcount = %d\n", hdr, refs);
77  if (!refs)
78  {
80 
82 
83  TRACE("destroying object %p\n", hdr);
84  if (hdr->type != WINHTTP_HANDLE_TYPE_SESSION) list_remove( &hdr->entry );
85  hdr->vtbl->destroy( hdr );
86  }
87 }
88 
90 {
93 
94  list_init( &hdr->children );
95  hdr->handle = NULL;
96 
98  if (!max_handles)
99  {
101  if (!(p = heap_alloc_zero( sizeof(ULONG_PTR) * num ))) goto end;
102  handles = p;
103  max_handles = num;
104  }
105  if (max_handles == next_handle)
106  {
107  num = max_handles * 2;
108  if (!(p = heap_realloc_zero( handles, sizeof(ULONG_PTR) * num ))) goto end;
109  handles = p;
110  max_handles = num;
111  }
113  if (handles[handle]) ERR("handle isn't free but should be\n");
114 
116  hdr->handle = (HINTERNET)(handle + 1);
118 
119 end:
121  return hdr->handle;
122 }
123 
125 {
126  BOOL ret = FALSE;
127  ULONG_PTR handle = (ULONG_PTR)hinternet;
129 
131 
132  if ((handle > 0) && (handle <= max_handles))
133  {
134  handle--;
135  if (handles[handle])
136  {
137  hdr = handles[handle];
138  TRACE("destroying handle 0x%lx for object %p\n", handle + 1, hdr);
139  handles[handle] = NULL;
140  ret = TRUE;
141  }
142  }
143 
145 
146  if (hdr)
147  {
149  {
150  TRACE("freeing child handle %p for parent handle 0x%lx\n", child->handle, handle + 1);
151  free_handle( child->handle );
152  }
153  release_object( hdr );
154  }
155 
159 
160  return ret;
161 }
#define WINHTTP_HANDLE_TYPE_REQUEST
Definition: winhttp.h:432
LPVOID HINTERNET
Definition: winhttp.h:32
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
Definition: sock.c:82
#define TRUE
Definition: types.h:120
char hdr[14]
Definition: iptest.cpp:33
GLuint GLuint end
Definition: gl.h:1545
#define HANDLE_CHUNK_SIZE
Definition: handle.c:35
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
static HWND child
Definition: cursoricon.c:298
uint32_t ULONG_PTR
Definition: typedefs.h:63
void send_callback(object_header_t *hdr, DWORD status, LPVOID info, DWORD buflen)
Definition: session.c:71
HINTERNET alloc_handle(object_header_t *hdr)
Definition: handle.c:89
unsigned int BOOL
Definition: ntddk_ex.h:94
WINE_DEFAULT_DEBUG_CHANNEL(msi)
smooth NULL
Definition: ftsmooth.c:416
#define WINHTTP_HANDLE_TYPE_SESSION
Definition: winhttp.h:430
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
Definition: list.h:108
#define TRACE(s)
Definition: solgame.cpp:4
static ULONG_PTR next_handle
Definition: handle.c:47
static object_header_t ** handles
Definition: handle.c:46
GLuint GLuint num
Definition: glext.h:9618
object_header_t * grab_object(HINTERNET hinternet)
Definition: handle.c:57
#define WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING
Definition: winhttp.h:391
int ret
#define InterlockedDecrement
Definition: armddk.h:52
uint32_t entry
Definition: isohybrid.c:63
BOOL free_handle(HINTERNET hinternet)
Definition: handle.c:124
LIST_ENTRY ProcessLocksList
Definition: winbase.h:848
void release_object(object_header_t *hdr)
Definition: handle.c:73
#define ERR(fmt,...)
Definition: debug.h:109
void close_connection(request_t *request)
Definition: request.c:1803
static CRITICAL_SECTION_DEBUG handle_cs_debug
Definition: handle.c:38
static unsigned __int64 next
Definition: rand_nt.c:6
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
#define InterlockedIncrement
Definition: armddk.h:53
static ULONG_PTR max_handles
Definition: handle.c:48
object_header_t * addref_object(object_header_t *hdr)
Definition: handle.c:50
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
Definition: list.h:149
unsigned int ULONG
Definition: retypes.h:1
#define ULONG_PTR
Definition: config.h:101
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
GLfloat GLfloat p
Definition: glext.h:8902
static CRITICAL_SECTION handle_cs
Definition: handle.c:37