shared_ptr<ndn::Data>
    NdnDataManager::operator[]( shared_ptr<const ndn::Interest> interest )
    {
            Name subname = interest->getName();
            auto it = subname.end()-1;

            while( ( it->isVersion() || it->isSegment()
                     || it->isSegmentOffset() || it->isTimestamp()
                     || it->isSequenceNumber() ) && ( it-- ) != subname.begin() );

            subname = subname.getPrefix( it - subname.begin() + 1 );

            if( m_producers.find( subname ) != m_producers.end() )
            {
                // find data producer
                auto producer = m_producers[subname];

                // if access level is 0, no access needs to be provided
                if( interest->getAuthTag().getAccessLevel() == 0 )
                {
                    Coordinator::
                    producerSatisfiedRequest( interest->getName().getPrefix( 2 ),
                                                interest->getName() );
                    return producer->makeData( interest );
                }

                // generate data packet
                shared_ptr<Data> data = producer->makeData( interest );

                // check that the interest's access rights
                // satisfy the data's requirements
                if( m_auth_manager->getTagAccess( interest->getAuthTag() )
                    < data->getAccessLevel() )
                {
                    Coordinator::
                    producerDeniedRequest( interest->getName().getPrefix( 2 ),
                                           interest->getName(),
                                           "Insufficient Auth" );
                    return makeNack( *data );
                }



                // check that the data satisfies interest
                if( interest->matchesData( *data ) )
                {
                    Coordinator::
                    producerSatisfiedRequest( interest->getName().getPrefix(2),
                                               interest->getName() );
                    return data;
                }
            }
           Coordinator::producerOther( interest->getName().getPrefix( 2 ),
                                       "No data matching "
                                       + interest->getName().toUri() );
           return NULL;

    };
Ejemplo n.º 2
0
int main( int argc, const char* argv[] ) {

	int result;
	int i = 1; // pq el parametro 0 es el ejecutable
	char* listBytes;
	char* listFields;

//	//esto no va, es para probar
//	parseList( argv[i], TYPE_BYTES);


	// itero el vector de parametros
	while( i<argc ){

		if( isVersion( argv[i] ) == 1 ){
			_isVersion = 1;
		} else if( isHelp(argv[i]) == 1 ){
			_isHelp = 1;
		} else if( isBytes(argv[i]) == 1 ){
			_isBytes = 1;
			// Parsear el argv[i+1] y determinar los elementos o rangos
			i++;
			listBytes = parseList( argv[i], TYPE_BYTES);
		} else if( isFields(argv[i]) == 1){
			_isFields = 1;
			// Parsear el argv[i+1] y determinar los elementos o rangos
			i++;
			listFields = parseList( argv[i], TYPE_FIELDS);
		} else if( isDelimiter(argv[i]) == 1 ){
			_isDelimiter = 1;
			// Parsear el argv[i+1] y determinar el delimitador
			i++;
			_delimiter = argv[i][0];	// el delimitador es de solo un caracter. Si tiene mas de uno se toma el primero
		} else if( isIgnore(argv[i]) == 1 ){
			_isIgnore = 1;

		} else{
			// argumento invalido!!!
			_hasInvalidParameters = 1;
			_invalidParameter = argv[i];
		}
		i++;
	}
//	puts(listBytes);
//	puts(listFields);
	if (_isFields==1){
		//Imprimir lo que corresponda
		imprimir(listFields, TYPE_FIELDS);
	}
	if (_isBytes==1){
		//Imprimir lo que corresponda
		imprimir(listBytes, TYPE_BYTES);
	}

	// Sino tiene parametros invalidos, sigo
	if( _hasInvalidParameters == 0 ){
		// ahora me fijo q operacion hay q hacer
		if( _isVersion == 1 ){
			// imprimo version y salgo
			puts("Imprimo Version!!");
		} else if(_isHelp==1){
			// imprimo help y salgo
			puts("Imprimo help!!");
		} else if(_isBytes==1){
			// hago la operacion del CUT segun el conjunto de bytes previamente parseado
			// y salgo
		} else if(_isFields==1){
			// hago la operacion del CUT (usando el delimitador seteado o default y el parametro ignore)
			// con el conjunto de fields previamente parseado y devuelvo el resultado por stdout
			// y salgo
		}
		result = EXIT_SUCCESS;
		puts("saliendo bien");
	} else {
		// si tiene parametros invalidos salgo
		result = EXIT_FAILURE;
		puts( "saliendo mal" );
	}

	puts("saliendo "); /* prints TP 0 */
//	puts(result);
	return result;
}