public void parse(MC2Parser mc2p) throws MC2ParserException, IOException {
        
        if(LOG.isDebug()) {
            LOG.debug("SearchDescriptorMC2Request.parse()", 
                    "checking if new provider list is available");
        }
        final String crc = mc2p.attribute(MC2Strings.acrc);

        // this will generate an XML warning if the list of providers is up to 
        // date, because then no nbr_services attribute will exist in the XML
        CharArray ca = mc2p.attributeCharArray(MC2Strings.alength);
        int nbrOfProviders = 0;
        if (ca != null) {
            nbrOfProviders = MC2Strings.number_type(ca);
        }
         
        // entering the actual descriptor response or "crc ok" message
        mc2p.children();
        
        if(mc2p.nameRefEq(MC2Strings.tcrc_ok)) {
            if(LOG.isDebug()) {
                LOG.debug("SearchDescriptorMC2Request.parse()", 
                        "Current list of providers is valid");
            }
            // we are done
            m_holder.noDescriptorUpdateAvailable();
            return;
        }

        // new provider list, parse it
        if(LOG.isDebug()) {
            LOG.debug("SearchDescriptorMC2Request.parse()", 
                    "new list of search providers available");
        }
        
        Provider[] providerArray = new Provider[nbrOfProviders];
        for (int i = 0; i < nbrOfProviders; i++) {
            providerArray[i] = parseProvider(mc2p);
            if(LOG.isTrace()) {
                LOG.trace("SearchDescriptorMC2Request.parse()", providerArray[i].toString());
            }
            mc2p.advance();
        }
        m_holder.setNewSearchDescriptor(new SearchDescriptor(crc, providerArray, m_settings.getLanguage().getId()), true);
    }