Exemplo n.º 1
0
static
rc_t CC
_VerifyTreeModelNode (
                const struct XFSModel * Model,
                const struct XFSModelNode * Node,
                uint32_t Flags
)
{
    rc_t RCt;
    const char * Prop, * Name;
    bool DoCheck;

    RCt = 0;
    Prop = NULL;
    Name = NULL;

    if ( Model == NULL || Node == NULL ) {
        return XFS_RC ( rcNull );
    }

    DoCheck = Flags != 0
            && ( Flags & XFS_CHECK_INTEGRITY ) == XFS_CHECK_INTEGRITY;

    if ( DoCheck ) {
            /* First we should check that name exists and not NULL */
        Name = XFSModelNodeName ( Node );
        if ( Name == NULL ) {
/*
printf ( "Node name missed\n" );
*/
            return XFS_RC ( rcInvalid );
        }

            /* checking noode with AS name */
        Prop = XFSModelNodeAs ( Node );
        if ( Prop != NULL ) {
            if ( XFSModelLookupNode ( Model, Prop ) == NULL ) {
/*
printf ( "Node [%s] can not stat node with 'AS' name [%s]\n", Name, Prop );
*/
                return XFS_RC ( rcInvalid );
            }
        }

            /* there should not be node with name as property 'label' */
        Prop = XFSModelNodeLabel ( Node );
        if ( Prop != NULL ) {
            /* TODO .... incorrect check, You should check all labels
                for all modell nodes
             */ 
            if ( XFSModelLookupNode ( Model, Prop ) != NULL ) {
/*
printf ( "Node [%s] with 'LABEL' [%s] already exists\n", Name, Prop );
*/
                return XFS_RC ( rcInvalid );
            }
        }
    }

    return RCt;
}   /* _VerifyTreeModelNoode () */
Exemplo n.º 2
0
LIB_EXPORT
rc_t CC
XFSNodeMake (
            const struct XFSModel * Model,
            const char * NodeName,
            const char * NameAlias,
            const struct XFSNode ** Node
)
{
    rc_t RCt;
    const struct XFSModelNode * ModelNode;
    const struct XFSTeleport * Teleport;
    struct XFSNode * NewNode;
    const char * NewNodeName;

    RCt = 0;
    ModelNode = NULL;
    Teleport = NULL;
    NewNode = NULL;
    NewNodeName = NULL;

    if ( Model == NULL || Node == NULL || NodeName == NULL ) {
        return XFS_RC ( rcNull );
    }

    * Node = NULL;

    ModelNode = XFSModelLookupNode ( Model, NodeName );
    if ( ModelNode == NULL ) {
        return XFS_RC ( rcNotFound );
    }

    if ( XFSModelNodeIsRoot ( ModelNode ) ) {
        NewNodeName = "/";
    }
    else {
            /*  I could use here '?:' operator, but i think that
             *  is more useful, cuz shows names priority:
             *     alias -> label -> name_given
             */
        NewNodeName = NameAlias;
        if ( NewNodeName == NULL ) {

            NewNodeName = XFSModelNodeLabel ( ModelNode );
            if ( NewNodeName == NULL ) {

                NewNodeName = NodeName;
            }
        }
    }

    RCt = XFSTeleportLookup ( 
                    XFSModelNodeType ( ModelNode ),
                    & Teleport
                    );
    if ( RCt == 0 ) {
        if ( Teleport == NULL ) {
            RCt = XFS_RC ( rcInvalid );
        }
        else {
            if ( Teleport -> Constructor == NULL ) {
                RCt = XFS_RC ( rcInvalid );
            }
            else {
                RCt = Teleport -> Constructor (
                                    Model,
                                    ModelNode,
                                    NameAlias,
                                    ( const struct XFSNode ** )& NewNode
                                    );
                if ( RCt == 0 ) {
                    RCt = _NodeSetName ( NewNode, NewNodeName );
                    if ( RCt != 0 ) {
                        XFSNodeDispose ( NewNode );
                    }
                    else {
                        * Node = NewNode;
                    }
                }
            }
        }
    }

/*
pLogMsg ( klogDebug, "XFSNodeMake ( \"$(name)\" ) As [$(alias)] ( $(node) ) [$(rc)]", "name=%s,alias=%s,node=%p,rc=%d", NodeName, ( NameAlias == NULL ? "NULL" : NameAlias ), ( void * ) NewNode, RCt );
*/

    return RCt;
}   /* XFSNodeMake () */