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 () */
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 () */