wine/dlls/gdi/env.c

156 lines
3.9 KiB
C

/*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "config.h"
#include <stdio.h>
#include <string.h>
#include "gdi.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];
strncpy( buffer, lpPortName, sizeof(buffer) );
buffer[sizeof(buffer)-1] = 0;
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;
LPSTR p;
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)
p = (LPSTR)lpdev;
else
p = (LPSTR)lpPortName;
if ((atom = PortNameToAtom(p, TRUE))
&& (env = SearchEnvTable(0))
&& (handle = GlobalAlloc16(GMEM_SHARE|GMEM_MOVEABLE, nCount))) {
if (!(p = GlobalLock16(handle))) {
GlobalFree16(handle);
return 0;
}
env->atom = atom;
env->handle = handle;
memcpy(p, lpdev, nCount);
GlobalUnlock16(handle);
return handle;
}
else return 0;
}
else return -1;
}