|  | /* | 
|  | * Driver Environment functions | 
|  | * | 
|  | * Note: This has NOTHING to do with the task/process environment! | 
|  | * | 
|  | * Copyright 1997 Marcus Meissner | 
|  | * Copyright 1998 Andreas Mohr | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
|  | */ | 
|  |  | 
|  | #include "config.h" | 
|  |  | 
|  | #include <stdarg.h> | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  |  | 
|  | #include "windef.h" | 
|  | #include "winbase.h" | 
|  | #include "wingdi.h" | 
|  | #include "wine/wingdi16.h" | 
|  | #include "wine/debug.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(gdi); | 
|  |  | 
|  | typedef struct { | 
|  | ATOM atom; | 
|  | HGLOBAL16 handle; | 
|  | } ENVTABLE; | 
|  |  | 
|  | static ENVTABLE EnvTable[20]; | 
|  |  | 
|  | static ENVTABLE *SearchEnvTable(ATOM atom) | 
|  | { | 
|  | INT16 i; | 
|  |  | 
|  | for (i = 19; i >= 0; i--) { | 
|  | if (EnvTable[i].atom == atom) | 
|  | return &EnvTable[i]; | 
|  | } | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | static ATOM GDI_GetNullPortAtom(void) | 
|  | { | 
|  | static ATOM NullPortAtom = 0; | 
|  | if (!NullPortAtom) | 
|  | { | 
|  | char NullPort[256]; | 
|  |  | 
|  | GetProfileStringA( "windows", "nullport", "none", | 
|  | NullPort, sizeof(NullPort) ); | 
|  | NullPortAtom = AddAtomA( NullPort ); | 
|  | } | 
|  | return NullPortAtom; | 
|  | } | 
|  |  | 
|  | static ATOM PortNameToAtom(LPCSTR lpPortName, BOOL16 add) | 
|  | { | 
|  | char buffer[256]; | 
|  |  | 
|  | lstrcpynA( buffer, lpPortName, sizeof(buffer) ); | 
|  |  | 
|  | if (buffer[0] && buffer[strlen(buffer)-1] == ':') buffer[strlen(buffer)-1] = 0; | 
|  |  | 
|  | if (add) | 
|  | return AddAtomA(buffer); | 
|  | else | 
|  | return FindAtomA(buffer); | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *           GetEnvironment   (GDI.133) | 
|  | */ | 
|  | INT16 WINAPI GetEnvironment16(LPCSTR lpPortName, LPDEVMODEA lpdev, UINT16 nMaxSize) | 
|  | { | 
|  | ATOM atom; | 
|  | LPCSTR p; | 
|  | ENVTABLE *env; | 
|  | WORD size; | 
|  |  | 
|  | TRACE("('%s', %p, %d)\n", lpPortName, lpdev, nMaxSize); | 
|  |  | 
|  | if (!(atom = PortNameToAtom(lpPortName, FALSE))) | 
|  | return 0; | 
|  | if (atom == GDI_GetNullPortAtom()) | 
|  | if (!(atom = FindAtomA((LPCSTR)lpdev))) | 
|  | return 0; | 
|  | if (!(env = SearchEnvTable(atom))) | 
|  | return 0; | 
|  | size = GlobalSize16(env->handle); | 
|  | if (!lpdev) return 0; | 
|  | if (size < nMaxSize) nMaxSize = size; | 
|  | if (!(p = GlobalLock16(env->handle))) return 0; | 
|  | memcpy(lpdev, p, nMaxSize); | 
|  | GlobalUnlock16(env->handle); | 
|  | return nMaxSize; | 
|  | } | 
|  |  | 
|  |  | 
|  | /*********************************************************************** | 
|  | *          SetEnvironment   (GDI.132) | 
|  | */ | 
|  | INT16 WINAPI SetEnvironment16(LPCSTR lpPortName, LPDEVMODEA lpdev, UINT16 nCount) | 
|  | { | 
|  | ATOM atom; | 
|  | BOOL16 nullport = FALSE; | 
|  | LPCSTR port_name; | 
|  | LPSTR device_mode; | 
|  | ENVTABLE *env; | 
|  | HGLOBAL16 handle; | 
|  |  | 
|  | TRACE("('%s', %p, %d)\n", lpPortName, lpdev, nCount); | 
|  |  | 
|  | if ((atom = PortNameToAtom(lpPortName, FALSE))) { | 
|  | if (atom == GDI_GetNullPortAtom()) { | 
|  | nullport = TRUE; | 
|  | atom = FindAtomA((LPCSTR)lpdev); | 
|  | } | 
|  | env = SearchEnvTable(atom); | 
|  | GlobalFree16(env->handle); | 
|  | env->atom = 0; | 
|  | } | 
|  | if (nCount) { /* store DEVMODE struct */ | 
|  | if (nullport) | 
|  | port_name = (LPSTR)lpdev; | 
|  | else | 
|  | port_name = lpPortName; | 
|  |  | 
|  | if ((atom = PortNameToAtom(port_name, TRUE)) | 
|  | && (env = SearchEnvTable(0)) | 
|  | && (handle = GlobalAlloc16(GMEM_SHARE|GMEM_MOVEABLE, nCount))) { | 
|  | if (!(device_mode = GlobalLock16(handle))) { | 
|  | GlobalFree16(handle); | 
|  | return 0; | 
|  | } | 
|  | env->atom = atom; | 
|  | env->handle = handle; | 
|  | memcpy(device_mode, lpdev, nCount); | 
|  | GlobalUnlock16(handle); | 
|  | return handle; | 
|  | } | 
|  | else return 0; | 
|  | } | 
|  | else return -1; | 
|  | } |