> developer support home

MARCH 1993 VOLUME 5 NUMBER 3


INDEX


MAD'S COLUMN

Hello and welcome to the March 1993 issue of Bullets!

"March-Madness" in the computer industry is over. As though at a basketball game, we watched at the IBM OS/2 Technical Interchange, at Interop and Uniforum, at the Microsoft Tech*Ed and at BrainShare '93 as hardware and software vendors alike dribbled, took foul shots and slam-dunked their way through hours of exciting competition.

At Interop, Novell "set the pick" for the arrival of NetWare 4.0. At BrainShare, John Landry asked us to watch our "fast break" and re-evaluate how we define future development, and Drew Majors told us that, while writing NLMs may not be "nothing but net," writing them is... "just different." And, in "three-point land," a new IBM leader said he will not hesitate to make the necessary changes. No matter where you looked, the contest was "in your face."

Competition, whether in sports or computers, is essential. This summer the Olympic Festival '93 will be held in San Antonio. Novell's NetWare SFT III has won the honor of being the hosting network on IBM PCs with a variety of popular third-party word processing, data entry and communications software invited to do the information exchange.

More on that after a word from our sponsors.

Happy_Programming!

Mad "Magic" Poarch
Director
Developer Support/Service


ARTICLES:

NWSNut: Developing NLMs with Novell's Look & Feel

The NLM SDK for NetWare 4.0 introduces new opportunities for NetWare application developers. An important component of the NLM SDK for NetWare 4.0 is the NWSNut interface. The NWSNut interface provides a set of C language library APIs for the NLM environment which allow developers to write NLMs that have the "look and feel" of NLMs developed by Novell. Now NetWare developers can design NLMs which have user interfaces similar to NLMs like MONITOR and INSTALL. This article describes the NWSNut interface, discusses its impact on developers, and finally, examines a sample NLM detailing the use of the NWSNut screen handling APIs.

NWSNut Overview

The screens created with the NWSNut Library APIs are much easier to manage and have expanded functionality over NLMs currently developed outside of Novell. The libraries allow you to use multiple colors and windows on the server, providing for a more robust product.

In addition to producing NLMs that look and feel like Novell NLMs, the NWSNut libraries provide a common standard for NLM user interfaces. Also included are tools that allow developers to create language-enabled, internationalized NLMs. Screens and function keys will operate the same for all NLMs written to use the NWSNut interface. As a result, this standardized interface will produce a simplified environment for end-users of NLM products.

NWSNut NLMs developed with the NLM SDK for NetWare 4.0 can also run on NetWare 3.11 servers when the AFTER311 NLM is also loaded on the server. These NLMs will run unmodified on NetWare 3.11 servers as long as NetWare 4.0-specific APIs are not used.

The NWSNut Interface is a set of C language APIs. The NWSNut library is made up of six major components:

  • Portals
  • Lists
  • Menus
  • Forms
  • Screen Messages
  • Help

Portals

The NWSNut library allows client NLMs to create windows on a server screen. The size, location, and type of these windows, or portals, can be controlled with the functions exported from the NWSNut library. Most of the information presented on a server screen by the NWSNut Library is done within a portal. When a portal is created, NWSNut sets up a portal control block (PCB) which manages and holds information about the portal, including the portal's position on the screen, its frame size, and its cursor state and position.

There are two categories of portals: direct and virtual. The type of the portal depends on whether the portal's screen is accessed directly, making it a "direct" portal, or buffered in memory, indicating a virtual portal. The portal type is determined by the value of the directFlag passed to NWSCreatePortal.

A virtual portal is an area of memory into which data intended for the portal is written. The data in memory is displayed on the physical screen when NWSUpdatePortal( ) is called. A virtual portal is normally used when the data to be displayed is larger than the physical screen or portal display area size. The portal must be scrolled from side to side or top to bottom to see the hidden parts of the screen in the virtual portal.

When you use a direct portal, the information displayed in the portal is written directly to the portal screen. What you see is what you get and the portal screen area cannot be scrolled.

Lists

The NWSNut NLM library allows client NLMs to build lists of items that can be presented on the screen for user interface actions. Lists are built using NWSNut APIs that create doubly linked lists containing pointers to the list items.

Lists are displayed in virtual portals. Menus and Forms are specialized lists, which users can scroll through and select the appropriate item(s). Each list type (lists, forms, menus) has related APIs that boost functionality.

Menus

Menuing is one of the basic areas of functionality available to NWSNut client NLMs. Menus present various options in a portal on the NWSNut screen which allow users to select an item from a range of available choices.

Forms

The NWSNut interface defines a type of list called a form that allows users to interactively edit many types of fields (integers, strings, booleans, and menus). Users can move between the different fields in the form and enter whatever kind of information each field requires.

Screen Messages

Screen messages presented in the NWSNut NLM Library are created with a set of utilities called the Message Tools. For language-enabling purposes, it is desirable to isolate all text strings from the source code. This functionality is provided by the way NWSNut interacts with the Message Tools. Isolated screen messages can be retrieved using the NWSGetMessage function.

Help

Help screens to be used with the NWSNut Library are created with the Help Librarian, HELPLIB.EXE. Help messages are isolated from the code in the same manner as screen messages. Isolation allows help messages to be language- enabled as well.

Other Features

A new feature of NetWare 4.0 is natural language enabling. The Message Tools and Help Librarian, included in the NLM SDK for NetWare 4.0, allow you to write language-enabled NLMs using the NWSNut interface. The language an NLM uses to display messages is determined by which language set you select as the preferred language set for the server when the NLM is loaded. The selected language set will be used whenever a message file exists for the specific NLM being loaded.

Default messages and help screens are an important part of the NLM. So, a French developer marketing an NLM to a primarily French audience would link in default messages in French.

When selling the same NLM to an English or German audience, the French developer would ship English or German message files with the NLM, although the default language would still be French. The multi-language capability of NWSNut NLMs will greatly increase the marketability of language- enabled NWSNut NLMs.

This article does not focus on the language enabling capabilities of the NWSNut libraries in conjunction with the Message Tools. Although not required, the Message Tools do work closely with the NWSNut Libraries, giving developers the ability to write language-enabled applications.

NWSNut NLM Development

Developing an NWSNut-based NLM can be simple or a very advanced process, but several concepts are common to all NWSNut-based NLMs. The following section discusses the basics steps required to use the NWSNut user interface APIs. NDEMO.NLM, included as the NWSNut example in the NLM SDK for NetWare 4.0, is used as a basis for this discussion. This NLM clearly demonstrates the basic features of the NWSNut APIs.

The initial code for the sample NLM (see Figure 1) is typical of the code required for all NWSNut client NLMs.

FIGURE 1: NDemo example source code

/* Get a handle for allocating a resource tag. */

   NLMHandle = GetNLMHandle();

/* Create a screen for displaying our information. */

   CLIBScreenID = CreateScreen("NUT Demo Screen",
                               AUTO_DESTROY_SCREEN);
   if (!CLIBScreenID)
      return;

/* Allocate a resource tag to use for memory allocations. */

   allocTag = AllocateResourceTag(NLMHandle,
                                  "NUT DEMO Alloc Tag",
                                  AllocSignature);
   if (!allocTag)
   {
      DestroyScreen(CLIBScreenID);
      return;
   }

/* Initialize the screen interface. */

   ccode = NWSInitializeNut(UTILITY_MSG, VERSION_320,
                            NORMAL_HEADER, 0, 0, 0,
                            CLIBScreenID, allocTag,
&handle);
   if (ccode)
   {
      DestroyScreen(CLIBScreenID);
      return;
   }

/* Setup a procedure to be called if unloaded from the
   console with an UNLOAD XXXXXX command. */

   AtUnload(myunload);

/* Activate the screen that you have created. */

   DisplayScreen(CLIBScreenID);

END of FIGURE 1
The first step is to obtain the NLMHandle of the executing NLM. NWSNut uses the NLMHandle to track the resources allocated for the NLM. NWSNut uses a screen created by the client NLM. Therefore, you need to create a screen and save the screenID, so NWSNut will know which screen to use to display portals. NWSNut also allocates memory on behalf of the client NLM if provided with a resource tag that is allocated by the client.

Once all of the requirements listed above are fulfilled, the client NLM calls NWSInitializeNut( ). This initialization function creates the NWSNut screen and screen header using the screen handle of the client NLM. The initialization function also creates a NUTInfo structure to track NWSNut data for the client. The NUTInfo structure is defined in NWSNUT.H. It is used to keep track of the status of the current portal, saved lists, help context, and messages for your NLM.

An "atunload" procedure is required to allow you to cleanup resources allocated on your behalf by NWSNut. The minimum requirement of the atunload function is to call NWSRestoreNut() and to destroy the CLIB screen.

The next step is to display, or "make current," the NWSNut screen created using the CLIB screen. The screen is displayed by calling the CLIB function DisplayScreen. The newly created NWSNut screen can now be used to create portals, lists, etc.

As portals are the basis of most NWSNut screens, they deserve additional discussion. Portals are created by calling the NWSCreatePortal API. The height, width, type and attributes of the portal are required to create the portal. However, the act of creating a portal does not enable NWSNut functions to write data to the portal. A Portal Control Block (PCB) is required for all functions that write to portals. To obtain the PCB, call NWSGetPCB( ) and pass in the portal number obtained from NWSCreatePortal( ).

Whenever you make a call to NWSSelectPortal( ), the portal is activated. NWSSelectPortal( ) brings the portal to the front, highlights the portal title and border, and enables the portals cursor if a cursor was specified when the portal was created.

To deselect a portal, you use the NWSDeselectPortal function. This selection and deselection capability gives you the ability to manage several different portals on the same screen, preferably in a user-friendly manner. To destroy Portals, call NWSDestroyPortal( ).

As discussed earlier, list items are created as a doubly- linked list. The list pointers point to the message lines to be used when the list is displayed. You can add items to the linked list by calling the NWSAppendToList function (see Figure 2). Items appended to lists are normally obtained from message files using the NWSGetMessage( ).

FIGURE 2: NWSNut list example

NWSInitList (handle, Free);
NWSAppendToList (NWSGetMessage (LIST_ITEM_1,
                                &(handle->messages)),
                                (void *) 0, handle);
NWSAppendToList (NWSGetMessage (LIST_ITEM_2,
                                &(handle->messages)),
                                (void *) 0, handle);
NWSAppendToList (NWSGetMessage (LIST_ITEM_3,
                                &(handle->messages)),
                                (void *) 0, handle);
NWSAppendToList (NWSGetMessage (LIST_ITEM_4,
                                &(handle->messages)),
                                (void *) 0, handle);
NWSList( ) (LIST_HEADER, 10, 40, 4,
   strlen (NWSGetMessage (LIST_HEADER,
                          &(handle->messages))) + 4,
                          M_ESCAPE | M_SELECT, NULL,handle,

                          NULL, ListAction, 0);

/* cleanup and discard this list */

NWSDestroyList (handle);

END of FIGURE 2
After creating the list, you can display it by calling NWSList( ). NWSList( ) displays the current list and allows the user to mark, select and perform other LIST options on the current list. As mentioned previously, menus are specialized forms of lists created using NWSAppendToMenu( ). You can display a menus by calling the NWSMenu function. NWSNut menus allow you to select multiple menu options from one menu, as well as specify a default selection.

To create forms, call NWSInitForm( ) and build the form by appending various types of fields to the form using append functions. Once all of the fields are appended to the form, it can be displayed by calling NWSEditForm( ). Various types of fields can be appended to the form, including integer, hexadecimal, boolean, comment, prompt string and menu fields. Menu fields allow you to give the user a group of selections from which to select for a specific field. Examples of these operations are contained in NDEMO.NLM.

One last step remains, however, that is essential to developing NWSNut client NLMs. The deallocation of NWSNut allocated resources is the responsibility of the client NLM. For every portal, list, menu or form create function there is a corresponding destroy function. The destroy function will deallocate the resources allocated on behalf of the client NLM for the specific function.

Finally, there are two steps that are common to the development of all NWSNut client NLMs. Since two of the initial steps were the NWSNut initialization and the creation of a CLIB screen, you must also recover the resources allocated by the NWSInitializeNut and destroy the CLIB screen. NWSRestoreNut( ) deallocates the tables created by the NWSInitializeNut and must be called before the termination of any NWSNut client NLM.

NWSNut client NLMs help NLM developers to create a useful and interactive computing environment. The NWSNut APIs provide a standardized, more supportable user interface NLM. Built-in language-enabling creates a larger marketing arena for NLM developers. The NWSNut APIs provide everything you need to develop NLMs with Novell's "look and feel."

For more information on the procedures described in this article, contact the Developer Support Group at 1-800- NETWARE (1-800-638-9273) or 1-801-429-5588. To purchase the NLM SDK for NetWare 4.0 or any other Novell Software Developer's Kit, contact Novell's Professional Developers' Program at 1-800-NETWARE or 1-801-429-5588.

DR DOS v6.0 Configuration & Batch Processing

DR DOS v6.0 allows you to take advantage of very powerful configuration and batch processing commands. This short article provides several general examples of how you can use these commands to create a variety of configurations and select any one on bootup.

Example 1: The use of GOTO in CONFIG file

The GOTO statement, as shown in Figure 3, is used to proceed directly to a label. This function works like the GOTO statement found in batch file processing.

FIGURE 3: GOTO statement in CONFIG file

?"Do you want to run QEMM (y/n)? " goto QEMM
?"Do you want to run MemoryMAX (y/n)? " goto DRDOS
:QEMM
DEVICE=c:\QTR_DECK\QEMM386.SYS
DEVICE=C:\DRDOS\HIDOS.SYS /B=FFFF
(additional QEMM driver lines go here...)
goto COMMON
:DRDOS
hidos=on
DEVICE=C:\DRDOS\EMM386.SYS /F=AUTO...
...
:COMMON
files=40
hibuffers=20

END of Figure 3
Example 2: The use of CHAIN in the CONFIG file This example in Figure 4 shows how you can link to other files that hold your configurations for each system setup. In the following CONFIG.SYS file, the two lines direct the configuration process to the files, QCONFIG.SYS and MCONFIG.SYS. The appropriate FILES, BUFFERS, etc. information is contained within those files and not within the main CONFIG.SYS file. If the response to both questions is no, a default configuration begins. The RETURN command cannot be used to return to the parent CONFIG file.

FIGURE 4: CHAIN statement in CONFIG file

?"Do you want to run QEMM (y/n)? " chain=QCONFIG.SYS
?"Do you want to run MemoryMAX (y/n)? " chain=MCONFIG.SYS
files=40
hibuffers=20

END of Figure 4
Example 3: Using SWITCH/RETURN and labels

With this technique, processing pauses on the SWITCH command until the user chooses an option. The appropriate option is selected by choosing a number. The SWITCH command then goes to the corresponding label. In Figure 5, 1 selects the label :NOLIM, 2 selects the label :512K and so on. The RETURN command returns processing to the line after SWITCH. Notice the use of the ECHO statement for setting up the menu options.

FIGURE 5: Using SWITCH/RETURN and labels

ECHO =    Choose how much Extended Memory you want to
convert
ECHO =    to LIM Memory for this session.
ECHO =
ECHO =          1 (or ENTER)    No LIM Memory
ECHO =          2               512K of Memory
ECHO =          3               1024K of Memory
ECHO =          4               2048K of Memory
ECHO =
ECHO =         Make your selection...

SWITCH NOLIM, 512K, 1024K, 2048K
GOTO DEFAULTS
:NOLIM
DEVICE=C:\DRDOS\EMM386.SYS /F=NONE /K=AUTO /B=FFFF /R=AUTO
RETURN
:512K
DEVICE=C:\DRDOS\EMM386.SYS /F=AUTO /K=512 /B=FFFF /R=AUTO
RETURN
:1024K
DEVICE=C:\DRDOS\EMM386.SYS /F=AUTO /K=1024 /B=FFFF /R=AUTO
RETURN
:2048K
DEVICE=C:\DRDOS\EMM386.SYS /F=AUTO /K=2048 /B=FFFF /R=AUTO
RETURN
:DEFAULTS
SHELL=C:\COMMAND.COM \C: /P /E:512
HIDOS=ON
HIBUFFERS=20
FILES=30

END of Figure 5
Example 4: How to use environment variables in the CONFIG

The use of variables in the CONFIG is not quite the same as in batch files. Because the command processor (COMMAND.COM) is not loaded until after CONFIG processing, environment variables are stored. These variables are then passed to the command processor where they can be tested and processed through the AUTOEXEC.BAT or other batch files.

It is not possible to test an environment variable in the CONFIG. The CLS, CPOS, EXIT and SET commands are featured in the example in Figure 6.

FIGURE 6: CLS, CPOS, EXIT and SET commands in CONFIG.SYS

:DEFAULTS
SHELL=C:\COMMAND.COM \C: /P /E:512
HIDOS=ON
HIBUFFERS=20
FILES=30
etc....
ECHO =         Choose which TSRs and Utilities you want
loaded
ECHO =               at BOOT time for this session.
ECHO =
ECHO =         1 (or ENTER)   None... just continue
ECHO =         2              Mouse & Cursor Drivers
ECHO =         3              Keyboard "Speeder"
ECHO =         4              Novell Network
ECHO =         5              Done with selections
ECHO =
ECHO =         Make your selection...

:MORE
CPOS 10,33
SWITCH NOTHING, CURSMOUS, SPEEDKEY, NOVELL, DONE
GOTO MORE

:DONE
:NOTHING
CLS
EXIT

:CURSMOUS
SET THINGS=ON
RETURN

:SPEEDKEY
SET SPEEDKEY=ON
RETURN

:NOVELL
SET NETWORK=ON
RETURN

END of Figure 6
The AUTOEXEC.BAT shown in Figure 7 picks up the environment variables. The AUTOEXEC.BAT file now allows testing of the environment variables and executes commands based upon the conditionals illustrated Figure 7.

FIGURE 7: AUTOEXEC.BAT picking up environment variables.

@ECHO OFF

:drdosbeg
VERIFY OFF
PATH C:\;C:\DRDOS;C:\BATS;C:\TOOLS;C:\WINDOWS
if "%things%"=="on" prompt
$e[s$e[0;70H$e[1;36m$t$e[u$e[1;36mDR
      DOS6$p$g$e[2;32m
if not "%things%"=="on" PROMPT [DR DOS] $P$G

SET TEMP=C:\TEMP
IF NOT "%TEMP%"=="" MD %TEMP% >NUL
if "%things%"=="on" HILOAD MOUSE
if "%things%"=="on" HILOAD CURSOR /s10
if "%speedkey%"=="on" c:\drdos\mode con:rate=30 delay=1
if "%network%"=="on" hiload c:\lan\ipx
if "%network%"=="on" hiload c:\lan\net3

:drdosend

END of Figure 7
Other Examples

Figure 8 shows how to select different AUTOEXEC.BAT files from CONFIG.SYS using the ? and the Shell statement. In the Shell statement the /P switch can be followed by a filename. When present, the named file will be executed instead of the AUTOEXEC.BAT. The named file must have a .BAT extension and cannot exceed 11 characters including path.

FIGURE 8: Selecting different AUTOEXECs using the "?" and the Shell statement

?"Default Autoexec? (y/n) "SHELL=C:\COMMAND.COM C:\ /P
/E:256
?"Alternate Autoexec? (y/n) "SHELL=C:\COMMAND.COM C:\
        /P:ALTERNAT.BAT /E:256

END of Figure 8
The example in Figure 9 employs "menu" choices with SWITCH. Notice how the "SET environment" variables can be used and tested for different AUTOEXEC type files in this example.

FIGURE 9: Employing "menu" choices with SWITCH

 CONFIG.SYS

ECHO =    1  For Windows Configuration
ECHO =    2  For QEMM Configuration
ECHO =    3  For DR DOS MemoryMAX Configuration
ECHO =    4  For 386MAX Configuration
ECHO =    5  For no Configuration... just exit
SWITCH win, qemm, memm, 386m, none
:none

set autoexec=norm
exit

:win
set autoexec=win
chain=wconfig.sys

:qemm
set autoexec=qemm
chain=qconfig.sys

:memm
set autoexec=memm
chain=mconfig.sys

:386m
set autoexec=386m
chain=386conf.sys

AUTOEXEC.BAT

@echo off
PATH C:\DRDOS;C:\;C:\UTIL;
VERIFY OFF
PROMPT $P$G
DISKMAP C: D:
IF "%autoexec%"=="norm" goto DRDOSEXIT
SHARE /L:40
IF "%autoexec%"=="win" SUPERPCK /EM /L:2048
IF "%autoexec%"=="qemm" CALL QEMM.BAT
IF "%autoexec%"=="memm" SUPERPCK  /A /L:2048
IF "%autoexec%"=="386m" CALL 386.BAT
:DRDOSEXIT

END of Figure 9
For more information about Novell's DR DOS v6.0 product, call 1-800-NETWARE or 1-801-429-5588.

TECHNICAL INSIGHTS:

Optimization with Duplicate Field Names (NetWare SQL v3.0)

If multiple tables in the same dictionary use the same field name, there can be a problem in optimizing some SQL statements. In Figure 10, notice that the tables both have a field called "Name", which is an index in table T2.

FIGURE 10: Example tables containing duplicate field names

 CREATE TABLE T1 USING "T1.DAT"
    (Name CHAR(20), ID INT(4)) WITH INDEX (ID);
 CREATE TABLE T2 USING "T2.DAT"
    (Name CHAR(20), Cust_ID INT(4)) WITH INDEX (Name);

END of FIGURE 10
The following select statement performs a join of these two tables:

SELECT * from T2, T1 where T2.ID =
T1.Cust_ID and Name = "John";

This statement will return the proper data set, but can also cause NetWare SQL to perform an optimized search utilizing the index in table T2 on the "Name" field. Since table T2 is the primary table in the view, and the restriction is based on an indexed field in the primary table, NetWare SQL should use the index to retrieve the records to be joined to table T1. This will only occur if NetWare SQL uses the "Name" field from table T2 when performing the restriction, and not the "Name" field from table T1.

When processing this query, NetWare SQL determines which Name field to use when it searches the dictionary for a field called "Name" that is in one of the tables in the view. Whichever Name field it finds first is the "Name" field it will use to perform the restriction. Since table T1 was created first, NetWare SQL will find its "Name" field first, and so it will use "T1.Name" to perform the restriction. In this case, NetWare SQL will do a file scan of table T2, join each record to table T1, and then check the resulting record for a Name of "John" from the T1 portion of the record.

To ensure that the optimization is performed correctly, qualify the field name with the appropriate table name or alias that should be used. The following select statement performs an optimized join of the two tables:

SELECT * from T2, T1 where T2.ID =
T1.Cust_ID and T2.Name = "John";

The "Name" field in the restriction is qualified with the table name from which the field should be taken. In this case, since "T2.Name" is an indexed field, NetWare SQL will retrieve only those records from table T2 which have a value of "John", and then join those records to table T1.

New CLib Documentation (Network C for NLMs v2.0 (e))

Network C for NLMs SDK (e) includes a file called NEW311.TXT that contains documentation for the following new CLib APIs:
  • ASCIIZToMaxLenStr( )
  • ReturnNLMVersionInfoFromFile( )
  • RetrurnNLMVersionInformation( )
  • RingTheBell( )
  • ThreadSwitchWithDelay( )
NEW311.TXT is located in the \NOVM directory of the SDK.

Btrieve Programmer's Manual Correction (NetWare Btrieve (NLM) v6.00)

The Btrieve Programmer's Manual for the v6.0 SDK incorrectly documents the Filter Portion for the Get Next Extended (36) operation, Get Previous Extended (37) operation, and Step Next Extended (operation 38) operations.

On page 4-69 and 4-83 the Get Next Extended and Get Previous Extended operation Filters are documented as:

1 Byte       Data type of field
2 Byte       Length of field
1 Byte       Comparison code
On page 4-131, the Step Next Extended operation Filter is documented as:
1 Byte       Data type of field
2 Byte       Offset of field
1 Byte       Comparison code
Each of the extended retrieval operations should specify a filter as on page 4-141 for the Step Previous Extended operation Filter:
1 Byte       Data type of field
2 Byte       Length of field
2 Byte       Offset of field
1 Byte       Comparison code

SuspendThread() Suspends Entire Thread Group (Network C for NLMs v2.0 (e))

With the Network C for NLMs SDK, when a thread uses SuspendThread( ) to suspend itself, it works properly. However, if you pass it the ThreadID of a different thread, it will suspend all threads in that thread's group.

To avoid suspending all threads in the group, if you want to suspend one thread from a another thread, place the thread to be suspended in its own thread group.

Compiler Error Using XQL.H Header (NetWare SQL v2.11)

The WATCOM v9.0 compiler does not allow any reference to the extra registers es, gs and fs in flat model. The XQL.H file contains a pragma which has the statement which results in the compiler error, "Illegal register modified by 'XQLEntry' #pragma":

modify [eax ecx edx fs gs 8087];

To avoid the compiler error, modify the statement by removing the reference to fs and gs as follows:

modify [eax ecx edx 8087];

The XQL.H file is used in conjunction with XQLNLM.C when developing an NLM that can communicate with the NetWare SQL NLM. The header and source module were first distributed with the NetWare SQL Developer's Kit v2.11.

Matching Btrieve Requester and DLLs (Btrieve for Windows v5.10)

Btrieve can return status 97 (Data Message Too Small) on Create operations with a Windows application if improper versions of the Btrieve Requesters and DLLs are used. However, this status code will not be returned at all workstations; some workstations will run the application without problems.

This situation results from leaving different versions of WBTRCALL.DLL in directories or having an inappropriate DLL in the default drive. If you have several DLLs in your path statement, Windows will search for DLLs in the following order:

  • Application-specific directory specified in an
  • .INI file
  • Current directory
  • Windows directory (e.g. C:\win31)
  • Windows system directory (e.g., C:\win31\system)
  • Application directory (i.e., path from which the program is retrieved (only Windows v3.1))
  • Directories specified in path
  • Mapped network directories
If you want to use both the client and requester versions of WBTRCALL.DLL, the client version must be converted WBTRLOCL.DLL with the WNDBCNUT.EXE utility. Make sure that you are always using the latest requesters available; currently BREQUEST.EXE v6.00b and WBTRCALL.DLL v6.00c. Make sure that no other versions of these two DLLs exist in other directories specified in your PATH statement. Otherwise, Btrieve may return the message "Requester not loaded," seemingly inappropriate status codes or the system may generate a general protection fault (GPF).

Reclaiming Memory from Deleted Extended Attributes (Network C for NLMs v2.00)

Calling WriteEA( ) with the dataBufferSize set to zero will remove the particular key and data components. The space occupied by a deleted extended attribute is not relinquished back to the operating system for general use. However, if another WriteEA( ) call is made that is actually entering a new extended attribute, the data space is used again. The data space can be recovered for general use, if the volume on which the extended attribute resided is dismounted and remounted.

NetWare LU6.2 DOS Programmers Guide Update (NetWare for SAA LU6.2 Tools v1.4)

In the documentation for NetWare LU6.2 v1.4, the workstation-to-workstation examples fail to mention a step involved in invoking NOVELL2.EXE. In the Netware LU6.2 DOS Programmer's Guide (page 5-9), before the statement "Please enter the 8 character mode name," insert the statement "Please enter the LU Local address (0 to 255)." NOVELL2.EXE requires this address. In addition, the manual should state that all options should be entered in upper case.

Open Btrieve Files & Non-Btrieve Apps (NetWare Btrieve (NLM) v6.0)

If Btrieve v6.0 opens files, they can still be accessed by a non-Btrieve application (like a DOS v5.0 COPY) without generating a Sharing Violation error. This situation does not arise with pre-6.0 versions of Btrieve and is not the result of a bug.

BTRIEVE.NLM v6.0 opens files differently than earlier versions of Btrieve. With Btrieve v6.0, files are first opened in Shared Read mode by the foreground process and, when data is written to the files, they are reopened by the Background Writer in exclusive Write, Shared Read mode. Versions of Btrieve before v6.0 opened the files with one exclusive Read/Write handle.

If you use BTRIEVE.NLM v5.x, the following scenario applies:

  • Backups fail if the Btrieve file is open.
  • A Sharing Violation Error is returned on any attempt to use a non-Btrieve application to open a Btrieve file that is already opened by Btrieve v5.x. With Btrieve 6.0, the outcome is different. To ensure database integrity when backing up files, either:
  • Make sure all the Btrieve files are closed before running the backup.
  • Use Continuous Operations.
  • Use a backup utility that opens the files in exclusive write mode. Even though the backup utility is only going to read from the file, it has to open the file in a mode that will prevent other processes from writing to it. Exclusive Write mode guarantees this. Make sure the backup utility can get exclusive rights to the file.

Self-Joined Views are Read-Only NetWare SQL v3.0

Under certain circumstances, a view is considered to be Read-Only --i.e., Insert, Update and Delete operations are not allowed. A list of criteria determining whether a view is Read-Only or not is included in the Getting Started manual provided with the NetWare SQL Developer's Kit v3.0, on pages 1-10 and 1-11. However, this list does not state that if a view contains a self-join (i.e., a file joined to itself), it is a Read-Only view.

Do not attempt to insert, update or delete records using a view containing a self-join. Any attempt to do so will return a status 318 - "Cannot Update View Defined in Read- Only Mode."


NIBBLES AND BITS

Fast Answers to Common Questions

NetWare C Interface for DOS

Q - When I try to delete a drive mapping, the floppy drive is accessed. Why does this happen?

A - MapDriveUsingString( ) does some processing and then calls the MapDrive API. If you look in the library source, however, you will notice that it always passes MapDrive( ) a base drive number of zero, which is the A: drive.

To avoid accessing the floppy drive, either use MapDrive( ), or correct the MapDriveUsingString( ) library source code as shown in Figure 11.

FIGURE 11: Necessary correction to MapDriveUsingString( )

Old line:

  /*-- map the drive --*/
  ccode = MapDrive( currConnectionID, (BYTE)0, fullPath,
                    searchFlag, searchOrder, &driveLetter );

New line:

  /*-- map the drive --*/
  if (searchFlag == DRIVE_DELETE)
  ccode = MapDrive( currConnectionID, 0xff, fullPath,
                    searchFlag, searchOrder, &driveLetter );
 else
  ccode = MapDrive( currConnectionID, (BYTE)0, fullPath,
                    searchFlag, searchOrder, &driveLetter );

END of FIGURE 11
Tip When you use the Borland C++ Compiler to compile an application, the linker may return unresolved external errors. These errors result because the NetWare C Interface for DOS and the NetWare C Interface for Windows use standard C functions. To resolve these error messages, use the following code fragment when including header files from these interfaces.
     #ifdef __cplusplus
     extern "C" {
     #endif

     #include 
     #include 
     #include 

     #ifdef __cplusplus
     }
     #endif

NetWare OS/2 SDK

Q - The documentation for the NetWare OS/2 Software Developer's Kit v1.3 does not describe an initialization value for the sequence number parameter in the NWScanFileInformation call. What is the proper value for this parameter?

A - The sequence number parameter should be initialized to -1.

Q - The documentation for the NetWare OS/2 SDK v1.3 describes the sequence number parameter for NWScanFileInformation2( ) as being an integer and also does not provide an initialization value. Please clarify this information.

A - The sequence number parameter should be declared as type "long" and should also be initialized to -1.

Q - On page IPX4-9 of the NetWare OS/2 API Reference, the first parameter in IPXGetLocalTarget( ), *puchTarget, is defined as a pointer to PUCHAR. However, PUCHAR is already defined as a pointer to an unsigned character typedefed in the OS/2 DEF.H file. What is the correct definition?

A - The documentation is incorrect. Define puchTarget as an output parameter (not an input parameter) of type PUCHAR (instead of *puchTarget).

NetWare Btrieve NLM

Q - Using the NetWare Btrieve NLM v6.0, BTRMON and NDBMON show files as opened by a different user than the one that originally opened the files and I can't back up or close those files. Why does this happen and what should I do?

A - When NetWare time restrictions are in force and a user's NetWare connection is terminated, Btrieve files opened to this connection remain open. If someone logs in and gets the same connection ID as the user who previously opened the files, the Monitor utilities show that the new user opened the files. Actually, Btrieve has these files open. The files should not be backed up unless they are in Continuous Operations mode.

The new user cannot access these files because he doesn't have the necessary Btrieve position blocks. The connection ID does not give the user access to the files because the user never opened the files. To avoid leaving files open, your application should perform an explicit Btrieve Reset operation, or the workstation should be rebooted before the NetWare time restrictions take effect.

NetWare SQL

Q - When I pass the view name for a joined view to the sTableNames parameter, a Status 204 (Table not defined in dictionary) is returned. What should I do?

A - To update a joined view, place the "*.*" string in the sTableNames parameter. The wildcard characters will ensure that all the tables associated with a joined view name will be updated. Another option is to send each table name comprising the joined view as a string (e.g., Personnel0Payroll0Dept0).


NOVELL DEVELOPER RELATIONS:

Designing Software for the International Market (Special supplement)

The international software market presents a large and expanding market for software developers, as can be seen by the worldwide system revenues outside the United States. Currently, the Japanese and Latin American software market are enjoying double-digit growth. Analysts expect this trend to continue for the next several years.

Novell currently receives about 51% of its revenue from markets outside the UnitedStates. For this reason, Novell is committed to expanding the international market. Third party developers are invited to join Novell in this market by making sure that their NetWare applications fit within the Novell internationalization strategy. This is the first in a series of articles to help you better understand how to develop your application for markets outside of the U.S.

Where do I start?

To bring your product to international markets, it is best is to understand some of the terminology involved in this effort.
  • Retroffiting - the process of adapting an existing product for a specific language. Retrofitting is generally undesirable if you plan to develop your application for several languages because of its high initial cost and even higher maintenance costs. In addition, the engineering effort must be repeated for each specific locale.
  • Enabling - the process of designing, implementing, and testing software that is easily adaptable to different locales with a minimum of engineering effort when introducing another language. The initial investment may be as high as retrofitting, but with each subsequent additional language, costs are greatly reduced.
  • Localization - the process of adapting an enabled piece of software to a particular locale. It consists of translation of user-viewable data and verification of the translation. The translation is typically done by professional translators, often in the particular locale, ideally with little or no work on the part of the application developer.
  • Internationalization - the combined process of enabling and localization. In other words, the programming effort required to enable software, plus the linguistic effort to translate and adapt it to a particular locale.

How Do I Enable my Products?

To enable products for the international market, Novell recommends that you first isolate all translatable data from your software. The data in a program that should be isolated and translated are often called resources. Various resources that should be isolated are as follows:
  • Text strings - including informational messages, abends, error messages, help text, etc.
  • Panels - also sometimes called dialogs, windows, and screens. C-worthy programmers must define the panels programmatically by composing a number of screens. A similar panel in Windows would be defined as a single resource, called a dialog template.
  • Program control - any shortcut commands (called accelerators in Windows) for experienced users. These accelerators are often mnemonically-based (for example, CTRL-C), and should therefore be translated.
  • Graphics - icons and bit maps are also frequently culture-specific and must be translated. For example, check marks in the U.S. are used to mark desired items. In Japan, a check mark means that something is bad or should be discarded.

What Tools Are Available for Enabling?

In NetWare 4.0, Novell provides a suite of utilities called Message Enabling Tools to manage the enabling and translation of software string resources such as error messages and menu items. The Message Enabling Tools are designed to work with the displayable text strings in NLMs, the NetWare operating system, text-based utilities, and DOS system-level software. Specifically the message tools do the following:
  • Isolate text messages from the source code, so that you don't have to recompile the source code whenever you want to change languages
  • Place the original text messages and translated versions of the messages into Language Modules, which are bound to their respective programs
  • Help test product enabling
  • Simplify dealings with translation houses by providing a single interface to translators
  • Provide technical support with a quick way to look up message sources
  • Provide translators with terminology lists derived from messages
In future versions of NetWare, Novell will support the graphical user interface environment by placing strings in resource-only DLLs.

How do I Translate Message Files for a Particular Locale?

Translation is only one part of localization but it is also a very important part. You should annotate the message strings before you give them to a translator. The more information you give the translator, the fewer headaches you will have later. Some of the information you may want to give the translator includes:
  • Length limits - almost all messages will be longer in their translated form than they were in English. In general, you should enable your software to handle variable-length messages, but if there are some messages that must not exceed a certain length, you must tell the translator.
  • Translatability - messages often contain keywords or product names that should remain the same in translation. Point these out to the translator.
  • Format - some messages are padded to begin or end in a certain column on the screen. If format is important for the message, you should tell the translator how to format the translation.
  • Variables - Variables, such as "%d" and "%s," must be annotated so that the translator knows if they are proper names. You must also number each variable so that the translator can indicate how they are to be reordered.
  • Context - when you extract messages from the source code, make sure you extract them from their context. It may be obvious when you are running a program that "Restore Menu" is the header title of the menu, but out of context, the translator could just as easily interpret it as the command "Restore the Menu."
In general, be generous when supplying general context notes for the translator; it will make the translator's job much easier and the translation will be much more accurate.

What Comes After Translation?

After translation, you will need to couple your localized resources with the executable code. The process is called coupling or bindling. Several coupling scenarios are possible.

Novell uses load coupling. In load coupling, the program finds its resources and loads them into memory during program initialization. Load time coupling facilitates multilingual support. There can be a different resource subdirectory for each language. Load time provides for flexible packaging (when customers want a language update, they receive only resources, no code). This method is used and recommended by Novell.

Some other possible coupling scenarios are as follows:

  • Compile/Assemble - because compilation and assembly require engineering resources, they should not be used to couple resources to executable code. It makes the logistics of the localization process more difficult (and many additional problems will come back to the engineer).
  • Link - for the same reasons, linkers should not be used to couple resources.
  • Static coupling - a utility either appends the resources to the executable image, or inserts the resources in a reserved area of the program. Static coupling has many of the disadvantages of compiling and linking the resources, and is not recommended.
  • Run - every time the program needs a resource, it loads it in from a resource file. Conceivably, a user could change the language at any moment during the program. This has the disadvantage of causing disk operations during inconvenient (or impossible) moments.

Special Considerations with Enabling and Localization

Some things you may want to be aware of in your enabling and localization efforts are as follows:
  • Monocasing - the method for converting a - z to uppercase using a simple arithmetic operation such as "if ('a' <=c && c<='z') c = 0x20;" will not support characters with diacritical marks or double-byte characters. The solution is to use monocasing tables for each locale.
  • Collation - like monocasing, collation is locale- dependent and should be handled in collation tables for each locale. For example, in Danish, the ligature ' comes after Z. For languages with non-alphabetic systems, such as Japanese, collation is much more complicated.
  • Date Formats - formats vary from country to country. For example, the date format in the U.S. is MMDDYY, in Spain, it is DDMMYY, and in Japan, YYMMDD.
  • Time Formats - time formats vary from a 12-hour to a 24-hour clock. The U.S. is one of the only countries that does not use a 24-hour clock. Some locales use colons to separate hours, minutes and seconds, others use periods.
  • Numeric and Monetary Formats - like time and date formats, these formats can vary from locale to locale.
  • Character Sets - 7-bit and 8-bit character sets are insufficient to handle the scripts used by many of the world's languages. If you want to handle Oriental scripts, you mast handle double-byte character sets as well
  • Hardware Enabling in the Japanese Market - the five different hardware architectures used in Japan present special challenges for software internationalization. Enabling applications for the Japanese market means converting programs to run not only on Japanese hardware, but on several different types of hardware. Thus, making sure that your application is independent of the hardware on which it is running becomes a must for applications intended for this market.

Products for International Software Development

To begin your application development now for the international marketplace, you will want to purchase one or both of the following products:
  • NetWare Client SDK for DOS, OS/2, and Windows (for client development)
  • NLM SDK for NetWare 4.0 (for server development).
Note that currently the Message Enabling Tools are only available with the NLM SDK for NetWare 4.0.

Are there any tools specific to development for the Japanese market?

Novell is working to make the NetWare 3.11J for DOSV operating system avail-able to registered members of Novell Professional Developers' Programs through a development license. Used in conjunction with the NetWare Client SDK or the NLM SDK for NetWare 4.0, you can retrofit your existing NetWare 3.11 applications using a standard IBM-compatible PC. Once you have retrofitted your application for this platform, you can consider other platforms like NetWare 3.11J for NEC.

The advantage of developing to NetWare-J is that it eliminates many of the hardware dependencies that developers encounter due to the various incompatible hardware platforms in the Japanese market. Novell Developer Relations actively supports developers who want to write to NetWare 3.11J. Contact Novell Developer Relations for more information on developing applications for the NetWare-J operating system.

YES, Our NLM is NetWare Tested & Approved! (Special supplement)

When customers ask about your NLM application, wouldn't it be great if you could say "YES! Our NLM is NetWare tested and approved." The NLM Certification Program allows you to do just that. The NLM Certification Program allows third party developers to design, develop, and submit their products for testing using the certification guidelines and test procedures from Novell Labs. Once tested and approved, your application earns the privilege of wearing the YES, NetWare Tested and Approved logo.

NLM Certification Program Benefits

Anyone who is developing NLM applications for the general marketplace can participate in the NLM Certification program. But why would I want to participate in the program you ask? The following are a few of the benefits you will receive:
  • Your NLM will be leaner, faster, and more technically correct.
  • Your NLM will be certified as running correctly with NetWare
  • Your NLM will be ensured to use network resources correctly and thus, will not affect the performance of the network or its integrity adversely
  • Your sales will increase as more and more customers look for the "Yes, NetWare Tested & Approved" logo on the products they consider purchasing
  • You have an additional, indirect source of technical support through Novell Labs that can help you write less code, encounter fewer problems, and generate better applications.
So is the process painful? No, actually it is quite simple. Read on for a step-by-step procedure for having your NLM certified.

Step 1: Purchase the NLM Certification Kit

To start the certification process, you will need the NLM Testing Tools SDK (Part# 884-0000059-001). This SDK is included in the Network C for NLMs SDK, so you may already have the tools you need. Otherwise, call 1-800-NETWARE and ask for the NLM Testing Tools SDK. As with all SDKs, you must be a member of the Novell Professional Developers' Program to obtain Novell SDKs. Membership in the program is free of charge to Novell developers.

The kit includes the following:

  • NLM Certification Manual - Read this manual first. It explains what behavior testing is and how to do it, as well as how to use the utilities provided on the diskette. It also explains how to submit a product for certification and the associated fees involved.
  • PCL User's Manual - A user's manual that describes how to determine the percentage of your NLM that is executed during your own testing procedure and helps you develop adequate testing procedures for your application.
  • NLM Master User's Guide - describes the suite of products you are provided that allow you to automate your NLM or DOS application testing on a network. This manual lets you automate the tests you created with PCL (Procedure Coverage Logger).
  • Three diskettes - that contain behavior testing utilities and user activity simulators.
If you plan to eventually have your NLM certified, it is better to use this Certification Kit to help design the product, rather than retrofit your application to meet these certification requirements later.

Step 2: Perform Testing at Your Location

Using the tools and guidelines provided in the kit, perform your own product testing at your location. Try to find and correct any problems associated with your NLM before submitting it to testing at Novell.

Note that you can stop at this step and never have to get your NLM certified, even if you purchase and use the kit in the design of your product. It is important to Novell that you use the kit to develop a quality NLM. Getting your NLM certified is a choice only you can make.

Step 3: Fill Out Forms and Pay Certification Fees

When you are ready to have your NLM certified, call Novell Labs at 1-801-429-5544 and they will send you the following forms:
  • Novell Labs Agreement - this form establishes the legal relationship between Novell and your company. You fill out this form only once no matter how many of your products are being certified.
  • Testing Request Form - you must fill out one of these forms for each product that you want tested and certified. Note that testing is requested and paid for by product, not by NLM.
With your completed forms, you will need to submit to the certification fee to Novell Labs. Pricing is not yet determined for certifying additional products or for recertifying major revisions to existing products (for example, your product is revised to run on additional operating systems).

Finally, you will need to call Novell Labs and obtain an evaluation purchase order number at 1-801-429-5544.

Step 4: Submit Your NLM to Novell Labs

Submit the following to Novell Labs:
  • Results of the behavior testing of the NLM performed at your site.
  • Any specialized equipment required for your NLM (for example, your NLM may require a particular CD-ROM drive). Novell Labs has standard network equipment at their site. All equipment submitted will be returned when testing is complete.
  • Two copies of your NLM: a copy containing Novell debugging information and a standard release copy.

Step 5: Novell Labs Tests and Certifies Your NLM

Novell Labs receives your NLM and completes the testing process. It is important to note that certification is not a pass/fail process. If changes to your NLM are required to complete certification, Novell Labs works with your company on an individual basis until your NLM completes the certification process. No one has ever failed to get their NLM certified. Novell's goal is to certify as many NLMs as possible, and is committed to working with you to accomplish this goal.

Step 6: Submit Shrink-Wrapped Products to Novell Labs

Once your NLM is certified, you will need to submit two shrink-wrapped copies of your certified product to Novell. One copy will be used in Novell Labs to test for compatibility with other certified products. The other one will be given to Technical Support to help with customer support of your product.

Special Limited Time Offer

If you are writing a NetWare 4.0 NLM or upgrading your existing NetWare 3.x NLM using the NLM SDK for NetWare 4.0, between now and July 1, 1993 Novell Labs may certify your NLM free of charge. Please contact Novell Labs Administration at (801) 429-5544 to learn more about this promotion.

Object Oriented Development Tools Announced (Special supplement)

At the Software Development Conference & Exhibition in February, Novell announced that Powersoft Corporation will incorporate access to NetWare services into its PowerBuilder object-oriented development environment.

PowerBuilder provides developers with an integrated suite of application painters and tools through which they completely manage the development process. PowerBuilder's object oriented approach allows developers to easily build quality graphic applications that communicate with high-performance database servers and particular NetWare services.

Under a joint development and marketing agreement, Novell will provide Powersoft with engineering support to ensure that the NetWare 3.11 and 4.0 APIs for directory, file, and print services are fully implemented as a PowerBuilder Library for NetWare.

Powersoft and Novell plan to work together to gather customer input to determine which additional services to incorporate in the future. The product will be available for all the operating systems that Powersoft supports.

In addition to the PowerBuilder Library for NetWare, Powersoft will develop interfaces to Novell's Btrieve record management system and the NetWare SQL relational database system. Database interfaces have been an integral part of PowerBuilder since its initial release. These interfaces allow developers to connect relational database servers to their applications. Currently, PowerBuilder provides access to the NLM and other versions of popular SQL engines such as Oracle, Sybase and Informix.

PowerBuilder for NetWare will be available during the third quarter of 1993.

For More Information

For additional information on development tools, developer support programs, and Novell Developers' Programs, call 1-800-NETWARE or 1-801-429-5588 (in the U.S. and Canada), or contact your local international Novell office.

NOVELL DEVELOPER EDUCATION

Novell Developer Education offers several courses for developers who use Novell's development & database tools, including NetWare SQL, Btrieve, Xtrieve PLUS, and the NetWare Client APIs.
904: Btrieve: An Overview
This new course provides a general overview of NetWare Btrieve v6.x and its new features. It covers file structures, indexing, data integrity, record and file locking, caching, operating modes, segmented keys, backward compatibility and utilities.
905: Programming with Btrieve
This course has been enhanced to cover all Btrieve operations & environments. It provides a complete introduction to Novell's server-based record manager. 50% of class time is spent in programming workshops. Working knowledge of C, BASIC, Pascal, or COBOL required. Prerequisite: 904: Btrieve: An Overview
907: Xtrieve PLUS
This course has been updated to include new features introduced with NetWare SQL v3.0. It teaches developers to use Xtrieve PLUS as a Btrieve or NetWare SQL programming utility. Trains users of Btrieve- or NetWare SQL-based database applications to work effectively with this menu driven utility.
911: NetWare Database Administrator
This new course gives a complete, hands-on look at installing and configuring NetWare SQL and NetWare Btrieve. It covers the basics of ANSI Standard Structured Query Language (SQL), focusing on NetWare SQL and key database features like security, referential integrity (RI), database design, data normalization and performance.
912: Programming with NetWare SQL
This new course is designed for developers and experienced network and database administrators who will be developing NetWare SQL applications or enhancing existing Btrieve applications with NetWare SQL. It provides an in-depth look at the functionality of NetWare SQL and discusses optimizing database systems for development of efficient applications using Novell database tools.
930: Developing NetWare Loadable Modules (NLMs)
This course introduces C programmers to server-based application development in the 32-bit NetWare 3.x environment. It covers basic concepts for writing server-based C applications that access the NetWare 3.x C library (CLib). Requires working knowledge of the C language.
940: NetWare Programming: Basic Services
This new lab-oriented class (40 percent lab work) introduces NetWare programming concepts. It covers topics such as bindery services, file system services, print services, queue management, connection and file-server services, and accounting and synchronization services. This class requires knowledge of the C programming language.
945: NetWare Programming: Protocol Support
This new class covers protocol support features. It also discusses network programming concepts and techniques for developing client-side applications, including Service Advertising Protocol (SAP) IPX/SPX, diagnostics, NetBIOS, TLI, and Named Pipes. This class requires strong knowledge of the C programming language.
To obtain information on pricing, location, scheduling, & course content for classes held in the US, call 1-800-233- 3382, 1-801-429-5508 or 1-800-NETWARE. Customers outside of the US should call 1-801-429-5508. For information on availability, location, and prices of classes outside of the US, contact your local Novell office.

CURRENT PATCHES FOR NOVELL DEVELOPMENT TOOLS

Applying current patches can save you a call to the Developer Support Group. The latest NetWare drivers, example code for NetWare API development tools, OS/2 requester patches, and patches for Novell database tools are available on Novell's Netwire forum on CompuServe. Back issues of Bullets and developer FYIs are also available (NOVLIB, library 11).

New information is first stored in NOVLIB library 1, and moved to library 7 after a period of 30 days. If you do not have access to CompuServe, you may request these files from Novell's Developer Support Group at 1-800-NETWARE (1-800-638-9273) or 1-801-429-5588.

When you call, be ready to provide a shipping address, disk preference (5.25", 3.5", HD, or DD) and, if you prefer overnight delivery, your company's Federal Express account number. If you do not provide a Federal Express account number, the patch disk will be sent to you via regular mail. Updated NetWare API SDK components can be obtained from Novell's NDEVREL forum on CompuServe. For more information on Novell developer programs contact Novell at 1-800-NETWARE (1-800-638-9273) or 1-801-429-5588.

A document describing available patches and other files and their location on CompuServe is available through Novell Developer Relation's Automated Fax System (AFS). AFS can provide you other useful information as well.

To use the AFS, call 1-800-RED-WORD (1-800-733-9673) or 512- 794-1799 from a touchtone phone. Choose the option for the Automated Fax System, select the documents you wish to receive, and supply your fax number (the fax number to which you want the document(s) sent). Document #7805 describes the patches. Document #1 lists other documents available through the AFS. You may request up to five documents per call.


CONTACTING NOVELL

Developer Support

Developers in the U.S. and Canada may contact Novell Developer Support via telephone, fax, BBS or electronic mail via CompuServe, MHS or the Internet.

Voice

For both presales and postsales support, call Novell Developer Support between 8:00 a.m. and 5:00 p.m. Mountain Time at 1-801-429-5588. Many calls to Novell Developer Support are passed to a software support engineer immediately. Calls to Novell Developer Support generally will be acknowledged or answered within four hours.

Fax

If you prefer, you may contact Novell Developer Support via fax at 1-801-429-2990. Faxed questions are acknowledged or answered within 24 hours.

Developer BBS

If you do not have access to either CompuServe or the Internet, send test cases to our BBS. Set your communication software to N-8-1 and call 1-801-429-5836.

E-mail: CompuServe

Post your messages in the appropriate section addressed to Novell at 76701,171. These messages will receive a response within 24 hours.

E-mail: MHS

You may direct your questions and comments to Novell Developer Support via Novell's Message Handling Service E-mail facility. Address your messages to devsup@novell. These messages will receive a response within 24 hours.

E-mail: Internet (SMTP)

An alternative method of contacting Novell Developer Support is through the Internet E-mail system. Send your messages to devsup@novell.com. These messages will receive a response within 24 hours.

NetWire on CompuServe

Novell's NetWire forum is open to all registered CompuServe subscribers. Through the NDEVSUP forum, professional developers writing applications with Novell development tools can gain access to information specific to Novell development. Support, patches, periodicals and product information, as well as information on all of the programs and services provided for Novell developers are accessible through this forum. Post your messages in the appropriate section addressed to Novell at 76701,171. Technical questions will be acknowledged or answered by Novell Developer Support within 24 hours.

Novell Products and SDKs

Novell products on the "Currently Shipping Developer Products" list (see page 15 of this issue), including the Red Box Products, are available to Novell Professional Developer's Program members. Call 1-800-RED-WORD (1-800-733-9673) or 1-303-894-4135 to order these products or to receive additional information. To order other Red Box Products not listed, contact your local Novell office or Novell Authorized Reseller.

Novell Labs

For information on Novell Labs development tools, education classes and product certification, in the U.S. and Canada call 1-800-453-1267 ext. 5544 or 1-801-429-5544, or call your local Novell office (see back cover of this issue).

Novell Developer Relations

Novell Professional Developers or those wishing to become members may contact Novell Developer Relations via telephone, fax, or electronic mail via Compuserve, MHS or the Internet.

Voice

For general information or questions on Novell Developer Relations programs, in the U.S. or Canada call 1-800-RED-WORD (1-800-733-9673). All others call 1-801-429-5281.

Fax

If you prefer, you may contact Novell Developer Relations via fax at 1-801-429-7207.

NetWire on CompuServe

Novell's NetWire forum is open to all registered Compuserve subscribers. Through the NDEVREL forum, Novell Professional Developer's Program-related issues or general questions may be posted. Through the NDEVINFO forum, customers who do not have products may post pre-sales product information questions on all Novell SDKs.

E-mail: MHS or Internet (SMTP)

You may direct your questions and comments to Novell Developer Relations via Novell's Message Handling Service E-mail facility. Address your messages to devprog@novell.com. Use the same address when going through the Internet E-mail system.

ACKNOWLEDGEMENTS

Publisher: Mad Poarch
Editor: Kirk R. Humphries
Design: Creative Services, Provo

Feature Articles: Clint McVey Robert Rodriguez Holly Roff

Contributors: Linda Anderson Jack Gumaer Chris Ojeda Raj Perubhatla Matt Pinsonneault Bob Quinlan Randy Reddy Michael A. Spano Wolfgang Schreiber Glenn Stephens Aslam Tejani Shiva E. Waldecker Brenda Wallace

Novell Professional Developer Bullets is a publication from Novell's Developer Support Group. Special thanks to the Developer Support, Development, Developer Relations, Product Marketing, and Marketing Communications staff who contributed time and valuable input.

(c) 1993 Novell, Inc. All rights reserved. Novell, the N design, NetWare, Btrieve, XQL, LAN WorkPlace and LANalyzer are registered trademarks; NetWare Loadable Module (NLM), NetWare Global Messaging, NetWare System Calls for DOS, NetWare Runtime, NetWare SQL, NetWare Btrieve, NetWare C Interface for DOS, NetWare System Interface Technical Overview, NetWare RPC, NetWare RPC 386, NetWare LU6.2, Report Executive, NetWare MHS, NetWare Asynchronous Communication Services (NACS), NetWare Management System, Professional Development Series, NetWare 3270 LAN Workstation, SFT III, and Xtrieve PLUS are trademarks; and NetWire and Professional Developers' Program are service marks of Novell, Inc. IBM and OS/2 are registered trademarks, and NetBIOS and SAA are trademarks of International Business Machines Corporation. Microsoft is a registered trademark, and Windows is a trademark of Microsoft Corporation. Apple, AppleTalk, and Macintosh are registered trademarks of Apple Computer, Inc. CompuServe is a registered trademark of CompuServe Corporation. NFS is a registered trademarks of Sun Microsystems, Inc. UNIX is a trademark of UNIX Systems Laboratories, Inc., a subsidiary of AT&T. Univel is trademark of Univel, Inc.