/*++ 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 // IN, LPTSTR, etc. #include #include #include #include #include #include // NetpAssert #include "netascii.h" #include "msystem.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) */ DWORD ILUI_setup_listW( LPTSTR buffer, DWORD bufsiz, DWORD offset, PDWORD bytesread, searchlist_data sdata[], searchlist slist[] ) { DWORD err; unsigned int msglen; int i; *bytesread = 0 ; for ( i=0; sdata[i].msg_no != 0; i++) { if (err = LUI_GetMsgInsW(NULL, 0, buffer, bufsiz, sdata[i].msg_no, (unsigned *) &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) * sizeof(TCHAR); } 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) */ DWORD ILUI_traverse_slistW( LPTSTR pszStr, searchlist *slist, PLONG pusVal ) { if (!slist) return (DWORD) -1; while (slist->s_str) { if (_tcsicmp(pszStr, slist->s_str) == 0) { *pusVal = slist->val ; return 0; } ++slist ; } return (DWORD) -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 * 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 */ DWORD LUI_GetMsgInsW( PTCHAR *istrings, DWORD nstrings, PTCHAR msgbuf, DWORD bufsize, DWORD msgno, unsigned int *msglen ) { DWORD result; DWORD tmplen = 0; static WCHAR NetMsgFileName[PATHLEN+1] = { 0 }; static WCHAR OS2MsgFileName[PATHLEN+1] = { 0 }; NetpAssert( bufsize > 0 ); *msgbuf = NULLC ; /* make a path to the LANMAN message file */ if (NetMsgFileName[0] == NULLC) { wcscpy(NetMsgFileName, MESSAGE_FILENAME); } /* make a path to the OS/2 message file */ if (OS2MsgFileName[0] == NULLC) { wcscpy(OS2MsgFileName, OS2MSG_FILENAME); } result = DosGetMessageW(istrings, nstrings, msgbuf, bufsize - 1, msgno, NetMsgFileName, &tmplen); if (result == ERROR_MR_MID_NOT_FOUND) { /* Cannot find -- try OS2 message file instead */ result = DosGetMessageW(istrings, nstrings, msgbuf, bufsize - 1, 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[min(tmplen, bufsize - 1)] = NULLC; if (msglen != NULL) { *msglen = tmplen; } return result; }