Example #1
0
Array * NNTPSession::fetchOverArticlesInRange(Range range, String * groupName, ErrorCode * pError)
{
    int r;
    clist * msg_list;
    
    selectGroup(groupName, pError);
    if (* pError != ErrorNone) {
        return NULL;
    }
    r = newsnntp_xover_range(mNNTP, (uint32_t) range.location, (uint32_t) (range.location + range.length), &msg_list);
    if (r == NEWSNNTP_ERROR_STREAM) {
        * pError = ErrorConnection;
        return NULL;
    }
    else if (r != NEWSNNTP_NO_ERROR) {
        * pError = ErrorFetchMessageList;
        return NULL;
    }
    
    Array * result = Array::array();
    clistiter * iter;
    for(iter = clist_begin(msg_list) ;iter != NULL ; iter = clist_next(iter)) {
        struct newsnntp_xover_resp_item * item;
        struct mailimf_fields * fields = NULL;
        
        item = (struct newsnntp_xover_resp_item *) clist_content(iter);
        if (!item) {
            continue;
        }
        
        r = xover_resp_to_fields(item, &fields);
        if (r == MAIL_NO_ERROR) {
            MessageHeader * header = new MessageHeader();
            header->importIMFFields(fields);
            result->addObject(header);
            header->release();
        }
    }
    
    newsnntp_xover_resp_list_free(msg_list);
    * pError = ErrorNone;
    
    return result;
}