2 * Driver Environment functions
4 * Note: This has NOTHING to do with the task/process environment!
6 * Copyright 1997 Marcus Meissner
7 * Copyright 1998 Andreas Mohr
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library 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. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "wine/wingdi16.h"
32 #include "wine/debug.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(gdi
);
41 static ENVTABLE EnvTable
[20];
43 static ENVTABLE
*SearchEnvTable(ATOM atom
)
47 for (i
= 19; i
>= 0; i
--) {
48 if (EnvTable
[i
].atom
== atom
)
54 static ATOM
GDI_GetNullPortAtom(void)
56 static ATOM NullPortAtom
= 0;
61 GetProfileStringA( "windows", "nullport", "none",
62 NullPort
, sizeof(NullPort
) );
63 NullPortAtom
= AddAtomA( NullPort
);
68 static ATOM
PortNameToAtom(LPCSTR lpPortName
, BOOL16 add
)
72 lstrcpynA( buffer
, lpPortName
, sizeof(buffer
) );
74 if (buffer
[0] && buffer
[strlen(buffer
)-1] == ':') buffer
[strlen(buffer
)-1] = 0;
77 return AddAtomA(buffer
);
79 return FindAtomA(buffer
);
83 /***********************************************************************
84 * GetEnvironment (GDI.133)
86 INT16 WINAPI
GetEnvironment16(LPCSTR lpPortName
, LPDEVMODEA lpdev
, UINT16 nMaxSize
)
93 TRACE("('%s', %p, %d)\n", lpPortName
, lpdev
, nMaxSize
);
95 if (!(atom
= PortNameToAtom(lpPortName
, FALSE
)))
97 if (atom
== GDI_GetNullPortAtom())
98 if (!(atom
= FindAtomA((LPCSTR
)lpdev
)))
100 if (!(env
= SearchEnvTable(atom
)))
102 size
= GlobalSize16(env
->handle
);
103 if (!lpdev
) return 0;
104 if (size
< nMaxSize
) nMaxSize
= size
;
105 if (!(p
= GlobalLock16(env
->handle
))) return 0;
106 memcpy(lpdev
, p
, nMaxSize
);
107 GlobalUnlock16(env
->handle
);
112 /***********************************************************************
113 * SetEnvironment (GDI.132)
115 INT16 WINAPI
SetEnvironment16(LPCSTR lpPortName
, LPDEVMODEA lpdev
, UINT16 nCount
)
118 BOOL16 nullport
= FALSE
;
124 TRACE("('%s', %p, %d)\n", lpPortName
, lpdev
, nCount
);
126 if ((atom
= PortNameToAtom(lpPortName
, FALSE
))) {
127 if (atom
== GDI_GetNullPortAtom()) {
129 atom
= FindAtomA((LPCSTR
)lpdev
);
131 env
= SearchEnvTable(atom
);
132 GlobalFree16(env
->handle
);
135 if (nCount
) { /* store DEVMODE struct */
137 port_name
= (LPSTR
)lpdev
;
139 port_name
= lpPortName
;
141 if ((atom
= PortNameToAtom(port_name
, TRUE
))
142 && (env
= SearchEnvTable(0))
143 && (handle
= GlobalAlloc16(GMEM_SHARE
|GMEM_MOVEABLE
, nCount
))) {
144 if (!(device_mode
= GlobalLock16(handle
))) {
145 GlobalFree16(handle
);
149 env
->handle
= handle
;
150 memcpy(device_mode
, lpdev
, nCount
);
151 GlobalUnlock16(handle
);