1.6 Add Object Requests

The NWDSAddObject function is used to add nodes to an NDS™ directory. If those nodes are container class objects, they can subsequently have objects attached to them. When calling this function, it is important to know the context of the object and the name you are going to give it, and to have a buffer prepared containing all required data for the object. The NWDSAddObject function has the following syntax:

  NWDSCCODE N_API NWDSAddObject( 
     NWDSContextHandle   context,          /* (IN) Indicates the 
                                              eDirectory context 
                                              for the request.*/ 
     pnstr8             *objectName,       /* (IN) Points to the name  
                                              of the object to be 
                                              added.*/  
     pnint_ptr          *iterationHandle,  /* (IN) */ 
     nbool8              more,             /* (IN) */ 
     pBuf_T              objectInfo);      /* (IN) Points to a request
                                               buffer containing the
                                               attributes and values for
                                               the new object. */
  

The context and objectName parameters are fairly self-explanatory. The objectInfo parameter points to a buffer, which is set up using NWDSAllocBuf and NWDSInitBuf.

The NWDSAllocBuf function is used to allocate an eDirectory buffer. This buffer can be of varying sizes, depending on your needs and preferences. However, Novell® has defined in nwdsdc.h two constants that are typically used with the size parameter of this function: DEFAULT_MESSAGE_LEN (4069) and MAX_MESSAGE_LEN (64512). The NWDSAllocBuf function has the following syntax:

  NWDSCCODE N_API NWDSAllocBuf( 
     size_t    size,  /* (IN)  Indicates the number of bytes to  
                               allocate to the buffer.*/ 
     ppBuf_T   buf);  /* (OUT) Points to an Buf_T containing the 
                               memory allocated for the buffer.*/
  

The NWDSInitBuf function is used to initialize an eDirectory buffer for an eDirectory request. Output buffers do not need to be initialized. For example, if you were calling NWDSRead and wanted all of the information for a particular object, you would not need to initialize a buffer. If, however, you wanted to request only specific information (a specific attribute), you would have to initialize a request buffer.

The NWDSInitBuf function has the following syntax:

  NWDSCCODE N_API NWDSInitBuf( 
      NWDSContextHandle   context,    /*(IN) Indicates the eDirectory 
                                             context for the request.*/ 
      nuint32             operation,  /*(IN) Indicates the eDirectory 
                                             operation for which 
                                             the buffer is being 
                                             initialized.*/ 
      pBuf_T              buf);       /*(IN) Points to the buffer being 
                                             initialized.*/
  

When calling NWDSInitBuf, you must specify the context handle and the buffer. You must also specify the intended use (allocation type) of the buffer in the operation parameter. See Section 5.3, Buffer Operation Types and Related Functions for a list of operation types. For the NWDSAddObject function, the operation type is DSV_ADD_ENTRY.

After the buffer has been created and initialized, you are ready to add the information to the buffer to create the new object. This is done by calling the NWDSPutAttrName and NWDSPutAttrVal functions. When you fill the buffer, you create a structure that logically looks something like this: attribute name — attribute value — attribute name — attribute value —.... Use alternating calls to NWDSPutAttrName and NWDSPutAttrVal. The following code segment demonstrates how you might use these functions before adding a new user.

  ccode=NWDSPutAttrName(dContext,inBuf,"Object Class"); 
     /* error checking goes here */ 
  ccode=NWDSPutAttrVal(dContext,inBuf,SYN_DIST_NAME,"User"); 
     /* error checking goes here */ 
  ccode=NWDSPutAttrName(dContext,inBuf,"Surname"); 
     /* error checking goes here */ 
  ccode=NWDSPutAttrVal(dContext,inBuf,SYN_CI_STRING,"Smith"); 
     /* error checking goes here */
  

The NWDSPutAttrName function has the following syntax:

  NWDSCCODE N_API NWDSPutAttrName( 
      NWDSContextHandle    context,   /*(IN) Indicates the NDS context 
                                             for the request.*/ 
      pBuf_T               buf,       /*(IN) Points to the request  
                                             buffer in which to store  
                                             the attribute name.*/ 
      pnstr8               attrName); /*(IN) Points to the attribute  
                                             name to store in the 
                                             request buffer.*/
  

The NWDSPutAttrVal function has the following syntax:

  NWDSCCODE N_API NWDSPutAttrVal( 
      NWDSContextHandle    context,  /* (IN) Indicates the NDS context  
                                             for the request.*/ 
      pBuf_T               buf,      /* (IN) Points to the request   
                                             buffer being prepared.*/ 
      nuint32              syntaxID, /* (IN) Indicates the data type 
                                             of the attribute value.*/ 
      nptr                 attrVal); /* (IN) Points to the attribute 
                                             value to be stored in the
                                             request buffer.*/
  

The syntaxID parameter contains the data type of the attribute value. This data type is defined for each attribute in Base Attribute Definitions. For instance, for the Object Class attribute, the sample code inputs the value User and the type SYN_DIST_NAME. The attribute values and syntax IDs are found in the Attribute Syntax Definitions. If you are trying to add a User, for example, Base Object Class Definitions defines the object User. These definitions (in NDK: Novell eDirectory Schema Reference) list all of the mandatory attributes as well as the optional attributes.

Next, for each of the attributes you want to set, go to Base Attribute Definitions which contains an entry for each attribute type; for example, the CN (Common Name) attribute. The definitions specify the syntax (for CN, this is Case Ignore String).

Attribute Syntax Definitions defines the Case Ignore Stringsyntax. This gives you not only the information for the syntaxID, or SYN_CI_STRING, but also the form that this attribute takes; in this case, a character pointer. Some attributes take the form of more complex structures.

The buffer must include the attribute name and its value for all mandatory attributes. Names and values for optional attributes can be added to the buffer or added after the object is created.

NOTE:Although the naming attribute for the object is always a mandatory attribute, do not add this attribute to the buffer. The objectName parameter of the NWDSAddObject function takes the value for one naming attribute. If the object has multiple naming attributes, use the objectName parameter for one attribute and add the others to the buffer.

Once you have the buffer set up with the appropriate attributes and values, you are ready to call NWDSAddObject.

See Also: