Пример #1
0
void data_test_2(T& foo)
{
    typedef std::vector<typename T::enum_type> FieldVec;
    FieldVec fields;
    fields.push_back(example::SHOE_PRICE);
    fields.push_back(example::GUM_PRICE);
    fields.push_back(example::CAR_PRICE);
    for(typename FieldVec::iterator i = fields.begin(); i != fields.end(); ++i) {
        visitor bar;
        foo.get_runtime_member(bar, *i);
    }
    TEST_ASSERT(val_print::o.str() == "example::SHOE_PRICE 23.2 example::GUM_PRICE 3 example::CAR_PRICE 20 ");
    val_print::o.str("");

    // Separately test with a temporary to make sure that it works
    // with the type inference.
    for(typename FieldVec::iterator i = fields.begin(); i != fields.end(); ++i) {
        foo.get_runtime_member(visitor(), *i);
    }
    TEST_ASSERT(val_print::o.str() == "example::SHOE_PRICE 23.2 example::GUM_PRICE 3 example::CAR_PRICE 20 ");
    val_print::o.str("");
}
void
XMLExtServiceHelper::appendExternalSearchDesc( DOMNode* out,
                                               DOMDocument* reply,
                                               DOMNode* cur,
                                               const MC2String& crcIn,
                                               const LangType& lang,
                                               int indentLevel,
                                               bool indent )
{
   DOMElement* ext_service_list =
      reply->createElement( X( "ext_services_reply" ) );
   out->appendChild( ext_service_list );

   DOMNode* transaction_id =
      cur->getAttributes()->getNamedItem( X("transaction_id") );
   // Transaction id should always be there when dtd is on.
   if ( transaction_id ) {
      ext_service_list->setAttribute( transaction_id->getNodeName(),
                                      transaction_id->getNodeValue() );
   }

   
   // FIXEME: Move the transacion id 
   
   // Add CRC
   bool crcOK = false;
   {
      MC2String intCrc = m_thread->getSearchHandler().getSearchHitTypesCRC(lang);
      ext_service_list->setAttribute( X("crc"), X( intCrc.c_str() ) );
      if ( crcIn == intCrc ) {
         ext_service_list->appendChild( reply->createElement(
                                           X( "ext_services_crc_ok" ) ) );
         crcOK = true;
      }
   }
   
   bool newClient;
   XMLTool::getAttrib<bool>( newClient, "new_client", cur, false );

   CompactSearchHitTypeVector availableProviders;

   CompactSearchHitTypeVector headings =
      m_thread->getSearchHandler().getSearchHitTypes(lang, newClient);
   
   for ( CompactSearchHitTypeVector::iterator it = headings.begin();
         it != headings.end(); it++ ) {
      if( it->m_round == 1 ) {
         availableProviders.push_back( *it );
      }
   }
   
   ext_service_list->setAttribute( X("nbr_services" ), XInt32( availableProviders.size() ) );
   
   if ( crcOK ) {
      // Now indent if necessary.
      if ( indent ) {
         XMLUtility::indentPiece( *ext_service_list, indentLevel );
      }
      return;
   }


   for ( CompactSearchHitTypeVector::const_iterator it = availableProviders.begin();
         it != availableProviders.end();
         ++it ) {
      
      // Create ext_service element for each service.
      DOMElement* ext_service = reply->createElement( X("ext_service" ) );
      ext_service_list->appendChild( ext_service );
      ext_service->setAttribute( X("type"), X("search") );
      DOMElement* name = reply->createElement( X("name") );
      ext_service->appendChild( name );
      name->appendChild( reply->createTextNode( X( it->m_name ) ) );
      ext_service->setAttribute( X("service_id"), 
                                 XInt32( it->m_serviceID ) );
      
      // Add the background colour as an attribute
      ext_service->setAttribute( X("background_colour"),
                                 XHex32( getColour( it->m_serviceID  ) ) );
      
      // Add the help text - currently empty.
      ext_service->appendChild(
         reply->createElement( X("ext_service_help" ) ) );

      // Add the icons.
      DOMElement* icons_el = reply->createElement( X( "icons" ) );

      uint32 nbrIcons = 0;
      
      ext_service->appendChild( icons_el );
      
      // if we dont have any icons we need to add two empty since the client
      // side cant seem to handle xml correctly
      if ( ! newClient && nbrIcons < 2 ) {
         using namespace XMLTool;
         for ( uint32 i = 0; i < 2 - nbrIcons; ++i ) {
            DOMElement* icon = addNode( icons_el, "icon" );
            addAttrib( icon, "name", MC2String("") );
            addAttrib( icon, "xsize", (uint32)0 );
            addAttrib( icon, "ysize", (uint32)0 );
            addAttrib( icon, "client_type", MC2String("mywf") );
            ++nbrIcons;
         }
      }


      XMLTool::addAttrib( icons_el, "nbr_icons", nbrIcons );

      FieldVec fields;
      // country is always required
      fields.push_back( SearchField( ExternalSearchHelper::getFieldName( ExternalSearchConsts::
                                                                         country, lang ),
                                     ExternalSearchConsts::country,
                                     "choice", 0x1 ) );


      if ( it->m_providerType == CompactSearchHitType::yellow_pages ) {
         // Search fields for providers of yellow pages type
         fields.push_back( SearchField( ExternalSearchHelper::getFieldName( ExternalSearchConsts::
                                                                            company_or_search_word, lang ),
                                        ExternalSearchConsts::company_or_search_word,
                                        "string",0x1 ) );
         fields.push_back( SearchField( ExternalSearchHelper::getFieldName( ExternalSearchConsts::
                                                                            city_or_area, lang ),
                                        ExternalSearchConsts::city_or_area,
                                        "string", 0 ) );
         fields.push_back( SearchField( ExternalSearchHelper::getFieldName( ExternalSearchConsts::
                                                                            category, lang ),
                                        ExternalSearchConsts::category,
                                        "string", 0 ) );

         

      } else if ( it->m_providerType == CompactSearchHitType::white_pages ) {
         // Search fields for providers of white pages type
         fields.push_back( SearchField( ExternalSearchHelper::getFieldName( ExternalSearchConsts::
                                                                            name_or_phone, lang ),
                                        ExternalSearchConsts::name_or_phone,
                                        "string",0x1 ) );
         fields.push_back( SearchField( ExternalSearchHelper::getFieldName( ExternalSearchConsts::
                                                                            address_or_city, lang ),
                                        ExternalSearchConsts::address_or_city,
                                        "string", 0 ) );
      }

      for ( FieldVec::iterator it2 = fields.begin();
            it2 != fields.end(); ++it2 ) {
         DOMElement* field = reply->createElement( X("field") );
         ext_service->appendChild( field );
         DOMElement* field_name = reply->createElement( X("field_name") );
         field->appendChild( field_name );
         field_name->appendChild( reply->createTextNode( X( it2->m_name ) ) );
         char tmp_str[128];
         sprintf( tmp_str, "%u", it2->m_id );
         field->setAttribute( X("id"), X( tmp_str) );
         sprintf( tmp_str, "%X", it2->m_required );
         field->setAttribute( X("req"), X( tmp_str ) );
         field->setAttribute( X("type" ), X( it2->m_type ) );
         if ( it2->m_id == 1 ) {
            // Country is choice field. Add the country as choice
            field->setAttribute( X("nbr_choices"), X( "1" ) );
            
            StringTable::countryCode country = ExternalSearchHelper::topRegionToCountryCode( it->m_topRegionID, lang );
            
            DOMElement* field_option =
               reply->createElement( X("field_option") );
            field->appendChild( field_option );
            sprintf( tmp_str, "%u", country );
            field_option->setAttribute( X("id"), X(tmp_str) );
            DOMElement* field_option_name =
               reply->createElement( X("field_option_name" ) );
            field_option->appendChild( field_option_name );
            
            
            MC2String strCountry = StringUtility::makeFirstCapital( StringTable::getString(
                                                                       StringTable::getCountryStringCode(country), lang) ) ;
            field_option_name->appendChild( reply->createTextNode( X( strCountry ) ) );
         }
      }
      
   } // for all descs
   
   // Now indent if necessary.
   if ( indent ) {
      XMLUtility::indentPiece( *ext_service_list, indentLevel );
   }
}