/* Added by MP. */ PRIVATE int HTNewsNode_compareRefThread (HTNewsNode* node1, HTNewsNode* node2) { int level1 = node1->refLevel; int level2 = node2->refLevel; int level = HTMAX(level1, level2); int i; HTNewsNode* parent1; HTNewsNode* parent2; int diff = 0; for (i = level; i >= 0; i--) { parent1 = (i < level1 ? parent1->refParent : node1); parent2 = (i < level2 ? parent2->refParent : node2); if (parent1 == parent2) return diff; /* related messages (in same subtree) */ else { time_t date1 = (i > level1 ? 0 : HTNewsNode_getDate(parent1, YES)); time_t date2 = (i > level2 ? 0 : HTNewsNode_getDate(parent2, YES)); diff = date1 - date2; if (diff == 0) { int idx1 = (i > level1 ? 0 : HTNewsNode_getIndex(parent1, YES)); int idx2 = (i > level2 ? 0 : HTNewsNode_getIndex(parent2, YES)); diff = idx1 - idx2; } } } return diff; /* completely unrelated messages */ }
/* Added by MP. */ PRIVATE BOOL HTNewsNode_linkRef (HTNewsNode* node, HTNewsNode* referer) { if (node && referer) { node->refChildren++; node->lastChild = referer; node->minRefIndex = (node->minRefIndex != 0 ? HTMIN(node->minRefIndex, referer->index) : referer->index); node->maxRefIndex = (node->maxRefIndex != 0 ? HTMAX(node->maxRefIndex, referer->index) : referer->index); node->minRefDate = (node->minRefDate != 0 ? HTMIN(node->minRefDate, referer->date) : referer->date); node->maxRefDate = (node->maxRefDate != 0 ? HTMAX(node->maxRefDate, referer->date) : referer->date); referer->refParent = node; return YES; } return NO; }
PRIVATE BOOL HTRank (HTRequest * request, HTArray * variants) { HTContentDescription * cd; void ** data; if (!variants) { HTTRACE(PROT_TRACE, "Ranking..... No variants\n"); return NO; } /* ** Walk through the list of local and global preferences and find the ** overall q factor for each variant */ cd = (HTContentDescription *) HTArray_firstObject(variants, data); while (cd) { double ctq_local = type_value(cd->content_type, HTRequest_conversion(request)); double ctq_global = type_value(cd->content_type, HTFormat_conversion()); double clq_local = lang_value(cd->content_language, HTRequest_language(request)); double clq_global = lang_value(cd->content_language, HTFormat_language()); double ceq_local = encoding_value(cd->content_encoding, HTRequest_encoding(request)); double ceq_global = encoding_value(cd->content_encoding, HTFormat_contentCoding()); HTTRACE(PROT_TRACE, "Qualities... Content type: %.3f, Content language: %.3f, Content encoding: %.3f\n" _ HTMAX(ctq_local, ctq_global) _ HTMAX(clq_local, clq_global) _ HTMAX(ceq_local, ceq_global)); cd->quality *= (HTMAX(ctq_local, ctq_global) * HTMAX(clq_local, clq_global) * HTMAX(ceq_local, ceq_global)); cd = (HTContentDescription *) HTArray_nextObject(variants, data); } /* Sort the array of all our accepted preferences */ HTArray_sort(variants, VariantSort); /* Write out the result */ #ifdef HTDEBUG if (PROT_TRACE) { int cnt = 1; cd = (HTContentDescription *) HTArray_firstObject(variants, data); HTTRACE(PROT_TRACE, "Ranking.....\n"); HTTRACE(PROT_TRACE, "RANK QUALITY CONTENT-TYPE LANGUAGE ENCODING FILE\n"); while (cd) { HTTRACE(PROT_TRACE, "%d. %.4f %-20.20s %-8.8s %-10.10s %s\n" _ cnt++ _ cd->quality _ cd->content_type ? HTAtom_name(cd->content_type) : "-" _ cd->content_language?HTAtom_name(cd->content_language):"-" _ cd->content_encoding?HTAtom_name(cd->content_encoding):"-" _ cd->filename ? cd->filename :"-"); cd = (HTContentDescription *) HTArray_nextObject(variants, data); } } #endif /* HTDEBUG */ return YES; }