/*
* Copyright (c) 2000 - 2001 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/


/** ----------------------------------------------------------------------- **
    @package:     NW_DOM

    @synopsis:    default

    @description: default

 ** ----------------------------------------------------------------------- **/
#ifndef NW_DOM_WBXML_TYPES_H
#define NW_DOM_WBXML_TYPES_H

#include <cxml_proj.h>
#include <nw_dom_node.h>

#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */

/** ----------------------------------------------------------------------- **
    @typedef:     NW_DOM_Extension

    @synopsis:    Tiny Dom Extension.

    @scope:       public
     
    @type:        NW_TinyDom_Extension_t

    @description: 
                  Tiny Dom Extension.

 ** ----------------------------------------------------------------------- **/
typedef NW_TinyDom_Extension_t NW_DOM_Extension_t;


/** ----------------------------------------------------------------------- **
    @typedef:     NW_DOM_Opaque

    @synopsis:    Opaque DOM type.

    @scope:       public
     
    @type:        NW_WBXML_Opaque_t

    @description: 
                  Opaque DOM type.

 ** ----------------------------------------------------------------------- **/
typedef NW_WBXML_Opaque_t NW_DOM_Opaque_t;


/* * Extension **/

/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Extension_new

    @synopsis:    Creates and initializes a new extension with a given 
                  token and string.

    @scope:       public

    @parameters:
       [in] NW_Uint32 token
                  Initialize with this token.

       [in] NW_String_t* str
                  Extension label.

    @description: Creates and initializes a new extension with a given 
                  token and string.

    @returns:     NW_DOM_Extension_t*
                  New extension.

 ** ----------------------------------------------------------------------- **/
NW_DOM_Extension_t*
NW_DOM_Extension_new(NW_Uint32 token, NW_String_t* str);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Extension_initialize

    @synopsis:    Initializes an extension with a token and string.

    @scope:       public

    @parameters:
       [in-out] NW_DOM_Extension_t* ext
                  The extension.

       [in] NW_Uint32 token
                  Initialize with this token.

       [in] NW_String_t* str
                  Extension label.

    @description: Initializes an extension with a token and string.

    @returns:     NW_Status_t
                  Result of operation.

       [NW_STAT_SUCCESS]
                  Always returns success.

 ** ----------------------------------------------------------------------- **/
NW_Status_t
NW_DOM_Extension_initialize(NW_DOM_Extension_t* ext, 
                            NW_Uint32 token, 
                            NW_String_t* str);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Extension_getString

    @synopsis:    Get string associated with this extension.

    @scope:       public

    @parameters:
       [in] NW_DOM_Extension_t* e
                  This extension.

       [out] NW_String_t* str
                  String for extension.

    @description: Get string associated with this extension.

    @returns:     NW_Status_t
                  Result of operation.

       [NW_STAT_SUCCESS]
                  Always returns success.

 ** ----------------------------------------------------------------------- **/
NW_Status_t
NW_DOM_Extension_getString(NW_DOM_Extension_t* e, 
                           NW_String_t* str);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Extension_getToken

    @synopsis:    Returns token of extension.

    @scope:       public

    @parameters:
       [in] NW_DOM_Extension_t* e
                  This extension.

    @description: Returns token of extension.

    @returns:     NW_Uint32
                  Token or null if error.

 ** ----------------------------------------------------------------------- **/
NW_Uint32
NW_DOM_Extension_getToken(NW_DOM_Extension_t* e);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Extension_delete

    @synopsis:    Deletes this extension.

    @scope:       public

    @parameters:
       [in-out] NW_DOM_Extension_t* e
                  This extension.

    @description: Deletes this extension.

    @returns:     NW_Status_t
                  Result of operation.

       [NW_STAT_SUCCESS]
                  Always returns success.

 ** ----------------------------------------------------------------------- **/
NW_Status_t
NW_DOM_Extension_delete(NW_DOM_Extension_t* e);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Opaque_new

    @synopsis:    Creates a new Opaque type with a given data and length.

    @scope:       public

    @parameters:
       [in] NW_Uint32 length
                  Length of data block.

       [in] NW_Byte* data
                  Data block.

    @description: Creates a new Opaque type with a given data and length.

    @returns:     NW_DOM_Opaque_t*
                  New opaque object.

 ** ----------------------------------------------------------------------- **/
NW_DOM_Opaque_t*
NW_DOM_Opaque_new(NW_Uint32 length, NW_Byte* data);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Opaque_initialize

    @synopsis:    Initializes an Opaque type with a given data and length.

    @scope:       public

    @parameters:
       [in-out] NW_DOM_Opaque_t* o
                  The opaque object.

       [in] NW_Uint32 length
                  Length of data block.

       [in] NW_Byte* data
                  Data block.

    @description: Initializes an Opaque type with a given data and length.

    @returns:     NW_Status_t
                  default

       [NW_STAT_SUCCESS]
                  Always returns success.

 ** ----------------------------------------------------------------------- **/
NW_Status_t 
NW_DOM_Opaque_initialize(NW_DOM_Opaque_t* o, 
                         NW_Uint32 length, 
                         NW_Byte* data);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Opaque_getLength

    @synopsis:    Returns length of opaque data.

    @scope:       public

    @parameters:
       [in] NW_DOM_Opaque_t* opaque
                  This opaque object.

    @description: Returns length of opaque data.

    @returns:     NW_Uint32
                  Length of data.

 ** ----------------------------------------------------------------------- **/
NW_Uint32
NW_DOM_Opaque_getLength(NW_DOM_Opaque_t* opaque);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Opaque_getData

    @synopsis:    Returns data from opaque.

    @scope:       public

    @parameters:
       [in] NW_DOM_Opaque_t* opaque
                  This opaque object.

    @description: Returns data from opaque.

    @returns:     NW_Byte*
                  Opaque data.

 ** ----------------------------------------------------------------------- **/
NW_Byte*
NW_DOM_Opaque_getData(NW_DOM_Opaque_t* opaque);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Opaque_delete

    @synopsis:    Delete this opaque object.

    @scope:       public

    @parameters:
       [in] NW_DOM_Opaque_t* opaque
                  This opaque object.

    @description: Delete this opaque object. Frees memory for data.

    @returns:     NW_Status_t
                  Result of operation.

       [NW_STAT_SUCCESS]
                  Always returns success.

 ** ----------------------------------------------------------------------- **/
NW_Status_t 
NW_DOM_Opaque_delete(NW_DOM_Opaque_t* opaque);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Opaque_getUserOwnsData

    @synopsis:    Determines if user owns data storage and can deallocate it.

    @scope:       public

    @parameters:
       [in] NW_DOM_Opaque_t* opaque
                  This opaque object.

    @description: Determines if user owns data storage and can deallocate it.

    @returns:     NW_Bool
                  NW_TRUE if user owns data storage and can deallocate it, 
                  otherwise NW_FALSE.

 ** ----------------------------------------------------------------------- **/
NW_Bool
NW_DOM_Opaque_getUserOwnsData(NW_DOM_Opaque_t* opaque);


/** ----------------------------------------------------------------------- **
    @function:    NW_DOM_Opaque_setUserOwnsData

    @synopsis:    Set user ownership flag on opaque data.

    @scope:       public

    @parameters:
       [in-out] NW_DOM_Opaque_t* opaque
                  This opaque object.

    @description: Set user ownership flag on opaque data.

    @returns:     NW_Status_t
                   Result of operation.

       [NW_STAT_SUCCESS]
                  Always returns success.

 ** ----------------------------------------------------------------------- **/
NW_Status_t
NW_DOM_Opaque_setUserOwnsData(NW_DOM_Opaque_t* opaque);

/*
combined WBXML attribute value and text components
*/

typedef enum NW_WbxmlComponent_e {
  NW_WBXML_ATTRIBUTE_VALUE_COMPONENT,
  NW_WBXML_TEXT_COMPONENT
} NW_WbxmlComponent_t;

NW_Status_t
NW_DOM_WbxmlComponent_setType(NW_WbxmlComponent_t AttributeValueOrText,
                              NW_TinyDom_AttrVal_t* pV,
                              NW_Uint32 type);

NW_Status_t
NW_DOM_WbxmlComponent_initFromString(NW_TinyDom_AttrVal_t* pV,
                                     NW_String_t * pString);

NW_Status_t
NW_DOM_WbxmlComponent_initFromEntity(NW_TinyDom_AttrVal_t* pV,
                                     NW_Uint32 entity);

NW_Status_t
NW_DOM_WbxmlComponent_initFromExtension(NW_TinyDom_AttrVal_t* val,
                                        NW_Uint16 token,
                                        NW_String_t* str);
NW_Status_t
NW_DOM_WbxmlComponent_initFromExtensionInt(NW_TinyDom_AttrVal_t* val,
                                           NW_Uint16 token,
                                           NW_Uint32 x);
NW_Status_t
NW_DOM_WbxmlComponent_initFromOpaque(NW_TinyDom_AttrVal_t* pV,
                                     NW_Uint32 byteCount,
                                     NW_Uint8* pData);
NW_Status_t
NW_DOM_WbxmlComponent_initFromToken(NW_TinyDom_AttrVal_t* pV,
                                    NW_Uint32 token);

NW_Uint32
NW_DOM_WbxmlComponent_getEntity(NW_TinyDom_AttrVal_t* pV);

NW_Status_t
NW_DOM_WbxmlComponent_getString(NW_TinyDom_AttrVal_t* pV,
                                NW_String_t* pString);

NW_Status_t
NW_DOM_WbxmlComponent_getExtensionToken(NW_TinyDom_AttrVal_t* val,
                                        NW_Uint16* pToken);

NW_Uint16
NW_DOM_WbxmlComponent_getExtension(NW_TinyDom_AttrVal_t* val,
                                   NW_String_t* str);

NW_Status_t
NW_DOM_WbxmlComponent_getExtensionInt(NW_TinyDom_AttrVal_t* val,
                                      NW_Uint32* x);
NW_Uint8*
NW_DOM_WbxmlComponent_getOpaque(NW_TinyDom_AttrVal_t* pV,
                                NW_Uint32 *pOpaqueByteCount);

NW_Uint16
NW_DOM_WbxmlComponent_getToken(NW_TinyDom_AttrVal_t* pV);

NW_Status_t
NW_DOM_WbxmlComponent_toString(NW_TinyDom_AttrVal_t* pV,
                               NW_String_t *string,
                               NW_Uint32 encoding);

/* converts an entire component sequence (via iterator on text or attrval) to string

returns either NW_STAT_SUCCESS or NW_STAT_DOM_NO_STRING_RETURNED if something fails */
NW_Status_t
NW_DOM_WbxmlComponent_sequenceToString(NW_WbxmlComponent_t AttributeValueOrText,
                                       NW_TinyDom_AttributeHandle_t* pIterator,
                                       NW_Uint32 encoding,
                                       NW_String_t* pOutString);

/* NW_Status_t NW_DOM_WbxmlComponent_[text|attribute]NextValue(pIterator, pV)
returns status NW_STAT_WBXML_ITERATE_MORE or NW_STAT_WBXML_ITERATE_DONE and fills in
*pV if returns NW_STAT_WBXML_ITERATE_MORE */
#define NW_DOM_WbxmlComponent_textNextValue(pIterator, pV) \
((NW_TinyDom_TextHandle_iterate((pIterator), (pV)) == 0)? NW_STAT_WBXML_ITERATE_DONE : NW_STAT_WBXML_ITERATE_MORE)

#define NW_DOM_WbxmlComponent_attributeNextValue(pIterator, pV) \
((NW_TinyDom_AttributeHandle_iterateValues((pIterator), (pV)) == 0)? NW_STAT_WBXML_ITERATE_DONE : NW_STAT_WBXML_ITERATE_MORE)


#ifdef __cplusplus
} // extern "C" {
#endif /* __cplusplus */

#endif  /* NW_DOM_WBXML_TYPES_H */
