bool PollSearchResultsTask::take( Transfer * transfer ) { if ( !forMe( transfer ) ) return false; Response * response = dynamic_cast<Response *>( transfer ); if ( !response ) return false; if ( response->resultCode() ) { setError( response->resultCode() ); return true; } // look for the status code Field::FieldList responseFields = response->fields(); Field::SingleField * sf = responseFields.findSingleField( Field::NM_A_SZ_STATUS ); m_queryStatus = sf->value().toInt(); Field::MultiField * resultsArray = responseFields.findMultiField( Field::NM_A_FA_RESULTS ); if ( !resultsArray ) { setError( Protocol ); return true; } Field::FieldList matches = resultsArray->fields(); const Field::FieldListIterator end = matches.end(); for ( Field::FieldListIterator it = matches.find( Field::NM_A_FA_CONTACT ); it != end; it = matches.find( ++it, Field::NM_A_FA_CONTACT ) ) { Field::MultiField * mf = static_cast<Field::MultiField *>( *it ); Field::FieldList contact = mf->fields(); GroupWise::ContactDetails cd = extractUserDetails( contact ); m_results.append( cd ); } // first field: Field::NM_A_SZ_STATUS contains #define SEARCH_PENDING 0 #define SEARCH_INPROGRESS 1 #define SEARCH_COMPLETED 2 #define SEARCH_TIMEOUT 3 #define SEARCH_CANCELLED 4 #define SEARCH_ERROR 5 // set a status code if needed // followed by Field::NM_A_FA_RESULTS, looks like a getdetails // add an accessor to get at the results list of ContactItems, probably if ( m_queryStatus != 2 ) setError( m_queryStatus ); else setSuccess( m_queryStatus ); return true; }
bool ModifyContactListTask::take( Transfer * transfer ) { if ( !forMe( transfer ) ) return false; Response * response = dynamic_cast<Response *>( transfer ); if ( !response ) return false; client()->debug( "ModifyContactListTask::take()" ); // scan the contact list received // emit each add and delete as a signal Field::FieldList fl = response->fields(); fl.dump( true ); Field::FieldListIterator it = fl.begin(); Field::FieldListIterator end = fl.end(); Field::MultiField * current = fl.findMultiField( NM_A_FA_RESULTS ); if ( current ) fl = current->fields(); current = fl.findMultiField( NM_A_FA_CONTACT_LIST ); if ( current ) { Field::FieldList contactList = current->fields(); Field::FieldListIterator cursor = contactList.begin(); const Field::FieldListIterator end = contactList.end(); while ( cursor != end ) { Field::MultiField * mf = dynamic_cast< Field::MultiField * >( *cursor ); if ( mf->tag() == NM_A_FA_CONTACT ) { // contact change processContactChange( mf ); } else if ( mf->tag() == NM_A_FA_FOLDER ) { // folder change processFolderChange( mf ); } ++cursor; } } // TODO: call virtual here to read any fields after the contact list... if ( response->resultCode() == GroupWise::None ) setSuccess(); else setError( response->resultCode() ); return true; }
bool ChatPropertiesTask::take( Transfer * transfer ) { if ( !forMe( transfer ) ) return false; Response * response = dynamic_cast<Response *>( transfer ); if ( !response ) return false; if ( response->resultCode() ) { setError( response->resultCode() ); return true; } Field::FieldList responseFields = response->fields(); Field::MultiField * resultsArray = responseFields.findMultiField( NM_A_FA_CHAT ); if ( !resultsArray ) { setError( Protocol ); return true; } Field::FieldList lst = resultsArray->fields(); const Field::FieldListIterator end = lst.end(); for ( Field::FieldListIterator it = lst.begin(); it != end; ++it ) { Field::SingleField * sf = dynamic_cast<Field::SingleField *>( *it ); if ( sf ) { if ( sf->tag() == NM_A_DISPLAY_NAME ) continue; else if ( sf->tag() == NM_A_CHAT_OWNER_DN ) m_ownerDn = sf->value().toString(); else if ( sf->tag() == NM_A_CHAT_CREATOR_DN ) m_creatorDn= sf->value().toString(); else if ( sf->tag() == NM_A_DESCRIPTION ) m_description = sf->value().toString(); else if ( sf->tag() == NM_A_DISCLAIMER ) m_disclaimer = sf->value().toString(); else if ( sf->tag() == NM_A_QUERY ) m_query = sf->value().toString(); else if ( sf->tag() == NM_A_ARCHIVE ) m_archive = sf->value().toString(); else if ( sf->tag() == NM_A_SZ_TOPIC ) m_topic = sf->value().toString(); else if ( sf->tag() == NM_A_CREATION_TIME ) m_creationTime.setTime_t( sf->value().toInt() ); else if ( sf->tag() == NM_A_UD_CHAT_RIGHTS ) m_rights = sf->value().toInt(); } else { Field::MultiField * mf = dynamic_cast<Field::MultiField *>( *it ); if ( mf ) { if ( mf->tag() == NM_A_FA_CHAT_ACL ) { Field::FieldList acl = mf->fields(); const Field::FieldListIterator aclEnd = acl.end(); for ( Field::FieldListIterator aclIt = acl.begin(); aclIt != aclEnd; ++aclIt ) { Field::MultiField * aclEntryFields = dynamic_cast<Field::MultiField *>( *aclIt ); if ( aclEntryFields ) { ChatContact entry; Field::FieldList entryFields = aclEntryFields->fields(); Field::SingleField * sf; if ( ( sf = entryFields.findSingleField ( NM_A_SZ_DN ) ) ) entry.dn = sf->value().toString(); if ( ( sf = entryFields.findSingleField ( NM_A_SZ_ACCESS_FLAGS ) ) ) entry.chatRights = sf->value().toInt(); kdDebug ( GROUPWISE_DEBUG_GLOBAL ) << "got acl entry: " << entry.dn << ", " << entry.chatRights << endl; m_aclEntries.append( entry ); } } } } } } kdDebug ( GROUPWISE_DEBUG_GLOBAL ) << "Got chatroom properties: " << m_chat << " : " << m_ownerDn << ", " << m_description << ", " << m_disclaimer << ", " << m_query << ", " << m_archive << ", " << m_topic << ", " << m_creatorDn << ", " << m_creationTime.toString() << ", " << m_rights << endl; finished(); return true; }
GroupWise::ContactDetails PollSearchResultsTask::extractUserDetails( Field::FieldList & fields ) { ContactDetails cd; cd.status = GroupWise::Invalid; cd.archive = false; // read the supplied fields, set metadata and status. Field::SingleField * sf; if ( ( sf = fields.findSingleField ( Field::NM_A_SZ_AUTH_ATTRIBUTE ) ) ) cd.authAttribute = sf->value().toString(); if ( ( sf = fields.findSingleField ( Field::NM_A_SZ_DN ) ) ) cd.dn =sf->value().toString().toLower(); // HACK: lowercased DN if ( ( sf = fields.findSingleField ( Field::KOPETE_NM_USER_DETAILS_CN ) ) ) cd.cn = sf->value().toString(); if ( ( sf = fields.findSingleField ( Field::KOPETE_NM_USER_DETAILS_GIVEN_NAME ) ) ) cd.givenName = sf->value().toString(); if ( ( sf = fields.findSingleField ( Field::KOPETE_NM_USER_DETAILS_SURNAME ) ) ) cd.surname = sf->value().toString(); if ( ( sf = fields.findSingleField ( Field::KOPETE_NM_USER_DETAILS_FULL_NAME ) ) ) cd.fullName = sf->value().toString(); if ( ( sf = fields.findSingleField ( Field::KOPETE_NM_USER_DETAILS_ARCHIVE_FLAG ) ) ) cd.archive = ( sf->value().toInt() == 1 ); if ( ( sf = fields.findSingleField ( Field::NM_A_SZ_STATUS ) ) ) cd.status = sf->value().toInt(); if ( ( sf = fields.findSingleField ( Field::NM_A_SZ_MESSAGE_BODY ) ) ) cd.awayMessage = sf->value().toString(); Field::MultiField * mf; QMap< QString, QVariant > propMap; if ( ( mf = fields.findMultiField ( Field::NM_A_FA_INFO_DISPLAY_ARRAY ) ) ) { Field::FieldList fl = mf->fields(); const Field::FieldListIterator end = fl.end(); for ( Field::FieldListIterator it = fl.begin(); it != end; ++it ) { // assumes each property only present once // check in logintask.cpp and if it's a multi field, // get the value of this instance, check if it's already in the property map and append if found. Field::SingleField * propField = dynamic_cast<Field::SingleField *>( *it ); if ( propField ) { QString propName = propField->tag(); QString propValue = propField->value().toString(); propMap.insert( propName, propValue ); } else { Field::MultiField * propList = dynamic_cast<Field::MultiField*>( *it ); if ( propList ) { QString parentName = propList->tag(); Field::FieldList propFields = propList->fields(); const Field::FieldListIterator end = propFields.end(); for ( Field::FieldListIterator it = propFields.begin(); it != end; ++it ) { propField = dynamic_cast<Field::SingleField *>( *it ); if ( propField ) { QString propValue = propField->value().toString(); QString contents = propMap[ propField->tag() ].toString(); if ( !contents.isEmpty() ) contents.append( ", " ); contents.append( propField->value().toString()); propMap.insert( propField->tag(), contents ); } } } } } } if ( !propMap.empty() ) { cd.properties = propMap; } return cd; }