/* * 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 #include #include #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; }