225 lines
5.7 KiB
C
225 lines
5.7 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1991-1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
luiint.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module provides routines for setting up search lists of string/value
|
||
|
pairs using messages in the NET.MSG message file, and for traversing
|
||
|
such a search list.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Dan Hinsley (danhi) 06-Jun-1991
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
User Mode - Win32
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
10-Jul-1989 chuckc
|
||
|
Created
|
||
|
|
||
|
24-Apr-1991 danhi
|
||
|
32 bit NT version
|
||
|
|
||
|
06-Jun-1991 Danhi
|
||
|
Sweep to conform to NT coding style
|
||
|
|
||
|
01-Oct-1992 JohnRo
|
||
|
RAID 3556: Added NetpSystemTimeToGmtTime() for DosPrint APIs.
|
||
|
|
||
|
20-Feb-1993 YiHsinS
|
||
|
Moved from netcmd\map32\search.c. And added LUI_GetMessageIns.
|
||
|
--*/
|
||
|
|
||
|
//
|
||
|
// INCLUDES
|
||
|
//
|
||
|
|
||
|
#include <windows.h> // IN, LPTSTR, etc.
|
||
|
|
||
|
#include <lmcons.h>
|
||
|
#include <stdio.h>
|
||
|
#include <lmerr.h>
|
||
|
|
||
|
#include <luiint.h>
|
||
|
#include <netlib.h>
|
||
|
|
||
|
/*-- routines proper --*/
|
||
|
|
||
|
/*
|
||
|
* Name: ILUI_setup_list
|
||
|
* Given an array of 'search_list_data' (ie. msgno/value
|
||
|
* pairs), create a string/value pair using the messages
|
||
|
* in the message file.
|
||
|
* Args: char * buffer - for holding the meesages retrieved
|
||
|
* USHORT bufsiz - size of the above buffer
|
||
|
* USHORT offset - the number of items already setup
|
||
|
* in slist, we will offset our retrieved
|
||
|
* string/value pais by this much.
|
||
|
* PUSHORT bytesread - the number of bytes read into buffer
|
||
|
* searchlist_data sdata[] - input array of msgno/value pairs,
|
||
|
* we stop when we hit a message number
|
||
|
* of 0
|
||
|
* searchlist slist[] - will receive the string/value pairs
|
||
|
* (string will be pointers into buffer)
|
||
|
* Returns: 0 if ok, NERR_BufTooSmall otherwise.
|
||
|
* Globals: (none)
|
||
|
* Statics: (none)
|
||
|
* Remarks: WARNING! We assume the caller KNOWs that slist is big enough
|
||
|
* for the pairs to be retrieved. This can be determined statically
|
||
|
* while buffer size cannot. Hence we provide checks for the
|
||
|
* latter.
|
||
|
* Updates: (none)
|
||
|
*/
|
||
|
USHORT
|
||
|
ILUI_setup_list(
|
||
|
CHAR *buffer,
|
||
|
USHORT bufsiz,
|
||
|
USHORT offset,
|
||
|
PUSHORT bytesread,
|
||
|
searchlist_data sdata[],
|
||
|
searchlist slist[]
|
||
|
)
|
||
|
{
|
||
|
USHORT err ;
|
||
|
unsigned int msglen ;
|
||
|
int i ;
|
||
|
|
||
|
*bytesread = 0 ;
|
||
|
for ( i=0; sdata[i].msg_no != 0; i++)
|
||
|
{
|
||
|
if (err = LUI_GetMsgIns(NULL,0,buffer,bufsiz,sdata[i].msg_no,
|
||
|
(unsigned far *)&msglen))
|
||
|
return(err) ;
|
||
|
slist[i+offset].s_str = buffer ;
|
||
|
slist[i+offset].val = sdata[i].value ;
|
||
|
buffer += msglen+1 ;
|
||
|
bufsiz -= msglen+1 ;
|
||
|
*bytesread += msglen+1 ;
|
||
|
}
|
||
|
|
||
|
return(0) ;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Name: ILUI_traverse_slist
|
||
|
* traverse a searchlist ('slist') of string/number pairs,
|
||
|
* and return the number matching string 'str'.
|
||
|
* Args: char * pszStr - the string to search for
|
||
|
* searchlist * slist - pointer to head of a searchlist
|
||
|
* int * pusVal - pointer to variable that receives
|
||
|
* the vale retrieved
|
||
|
* Returns: 0 if found, -1 otherwise.
|
||
|
* Globals: (none)
|
||
|
* Statics: (none)
|
||
|
* Remarks: (none)
|
||
|
* Updates: (none)
|
||
|
*/
|
||
|
USHORT
|
||
|
ILUI_traverse_slist(
|
||
|
PCHAR pszStr,
|
||
|
searchlist * slist,
|
||
|
SHORT * pusVal
|
||
|
)
|
||
|
{
|
||
|
if (!slist)
|
||
|
return( (USHORT) -1) ;
|
||
|
while (slist->s_str)
|
||
|
{
|
||
|
if (_stricmp(pszStr,slist->s_str) == 0)
|
||
|
{
|
||
|
*pusVal = slist->val ;
|
||
|
return(0) ;
|
||
|
}
|
||
|
++slist ;
|
||
|
}
|
||
|
return( (USHORT) -1) ;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Name: LUI_GetMsgIns
|
||
|
* This routine is very similar to DOSGETMESSAGE,
|
||
|
* except it:
|
||
|
* 1) looks for messages in specific files
|
||
|
* in a specific order:
|
||
|
* a) MESSAGE_FILE in <lanman_dir>
|
||
|
* b) MESSAGE_FILENAME in DPATH
|
||
|
* c) OS2MSG_FILENAME in DPATH
|
||
|
* 2) guarantees a null terminates string
|
||
|
* 3) will accept NULL for msglen (see below).
|
||
|
* Args: istrings : pointer to table of insert strings
|
||
|
* nstrings : number of insert strings
|
||
|
* msgbuf : buffer to hold message retrieved
|
||
|
* bufsize : size of buffer
|
||
|
* msgno : message number
|
||
|
* msglen : pointer to variable that will receive message length
|
||
|
* Returns: zero if ok, the DOSGETMESSAGE error code otherwise
|
||
|
* Globals: (none)
|
||
|
* Statics: NetMsgFileName, OS2MsgFileName
|
||
|
*/
|
||
|
USHORT
|
||
|
LUI_GetMsgIns(
|
||
|
PCHAR *istrings,
|
||
|
USHORT nstrings,
|
||
|
PSZ msgbuf,
|
||
|
USHORT bufsize,
|
||
|
ULONG msgno,
|
||
|
unsigned int *msglen
|
||
|
)
|
||
|
{
|
||
|
USHORT result, tmplen ;
|
||
|
static WCHAR NetMsgFileName[PATHLEN+1] = { 0 };
|
||
|
static WCHAR OS2MsgFileName[PATHLEN+1] = { 0 };
|
||
|
|
||
|
*msgbuf = '\0' ;
|
||
|
|
||
|
/* make a path to the LANMAN message file */
|
||
|
if (NetMsgFileName[0] == '\0') {
|
||
|
wcscpy(NetMsgFileName, MESSAGE_FILENAME);
|
||
|
}
|
||
|
|
||
|
/* make a path to the OS/2 message file */
|
||
|
if (OS2MsgFileName[0] == '\0') {
|
||
|
wcscpy(OS2MsgFileName, OS2MSG_FILENAME);
|
||
|
}
|
||
|
|
||
|
result = DosGetMessage( istrings,
|
||
|
nstrings,
|
||
|
msgbuf,
|
||
|
(USHORT) (bufsize - 1),
|
||
|
(USHORT) msgno,
|
||
|
NetMsgFileName,
|
||
|
&tmplen);
|
||
|
|
||
|
if (result == ERROR_MR_MID_NOT_FOUND) { /* cannot find */
|
||
|
/* try OS2 message file instead */
|
||
|
result = DosGetMessage(istrings,
|
||
|
nstrings,
|
||
|
msgbuf,
|
||
|
(USHORT) (bufsize - 1),
|
||
|
(USHORT) msgno,
|
||
|
OS2MsgFileName,
|
||
|
&tmplen);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* in all DosGetMessage above we passed it bufsize-1, so we are
|
||
|
* assure of at least one spare byte for the \0 terminator.
|
||
|
*/
|
||
|
msgbuf[tmplen] = '\0' ;
|
||
|
if (msglen != NULL) {
|
||
|
*msglen = tmplen ;
|
||
|
}
|
||
|
|
||
|
return(result) ;
|
||
|
}
|