static MsgInfo *news_parse_xover(struct newsnntp_xover_resp_item *item) { MsgInfo *msginfo; /* set MsgInfo */ msginfo = procmsg_msginfo_new(); msginfo->msgnum = item->ovr_article; msginfo->size = item->ovr_size; msginfo->date = g_strdup(item->ovr_date); msginfo->date_t = procheader_date_parse(NULL, item->ovr_date, 0); msginfo->from = conv_unmime_header(item->ovr_author, NULL, TRUE); msginfo->fromname = procheader_get_fromname(msginfo->from); msginfo->subject = conv_unmime_header(item->ovr_subject, NULL, TRUE); remove_return(msginfo->from); remove_return(msginfo->fromname); remove_return(msginfo->subject); if (item->ovr_message_id) { gchar *tmp = g_strdup(item->ovr_message_id); extract_parenthesis(tmp, '<', '>'); remove_space(tmp); if (*tmp != '\0') msginfo->msgid = g_strdup(tmp); g_free(tmp); } /* FIXME: this is a quick fix; references' meaning was changed * into having the actual list of references in the References: header. * We need a GSList here, so msginfo_free() and msginfo_copy() can do * their things properly. */ if (item->ovr_references && *(item->ovr_references)) { gchar **ref_tokens = g_strsplit(item->ovr_references, " ", -1); guint i = 0; char *tmp; char *p; while (ref_tokens[i]) { gchar *cur_ref = ref_tokens[i]; msginfo->references = references_list_append(msginfo->references, cur_ref); i++; } g_strfreev(ref_tokens); tmp = g_strdup(item->ovr_references); eliminate_parenthesis(tmp, '(', ')'); if ((p = strrchr(tmp, '<')) != NULL) { extract_parenthesis(p, '<', '>'); remove_space(p); if (*p != '\0') msginfo->inreplyto = g_strdup(p); } g_free(tmp); } return msginfo; }
/* * Parse address from header buffer creating address in cache. * Enter: harvester Harvester object. * entry Header object. * cache Address cache to load. * hdrBuf Pointer to header buffer. */ static void addrharvest_parse_address( AddressHarvester *harvester, HeaderEntry *entry, AddressCache *cache, const gchar *hdrBuf ) { gchar buffer[ ADDR_BUFFSIZE + 2 ]; gchar buf[ADDR_BUFFSIZE]; const gchar *bp; const gchar *ep; gchar *atCh, *email, *name; gint bufLen; /* Search for an address */ while((atCh = addrharvest_find_at( hdrBuf )) != NULL) { /* Find addres string */ addrharvest_find_address( hdrBuf, atCh, &bp, &ep ); /* Copy into buffer */ bufLen = ( size_t ) ( ep - bp ); if( bufLen > ADDR_BUFFSIZE ) { bufLen = ADDR_BUFFSIZE; } strncpy( buffer, bp, bufLen ); buffer[ bufLen ] = '\0'; buffer[ bufLen + 1 ] = '\0'; buffer[ bufLen + 2 ] = '\0'; /* Extract address from buffer */ email = addrharvest_extract_address( buffer ); if( email ) { /* Unescape characters */ mgu_str_unescape( buffer ); /* Remove noise characaters */ addrharvest_del_email( buffer, REM_NAME_STRING ); addrharvest_del_email( buffer, REM_NAME_STRING2 ); /* Remove leading trailing quotes and spaces */ mgu_str_ltc2space( buffer, '\"', '\"' ); mgu_str_ltc2space( buffer, '\'', '\'' ); mgu_str_ltc2space( buffer, '\"', '\"' ); mgu_str_ltc2space( buffer, '(', ')' ); g_strstrip( buffer ); if( g_strcasecmp( buffer, email ) == 0 ) { name = ""; } else { name = buffer; conv_unmime_header(buf, sizeof(buf), name, NULL); } /* Insert into address book */ addrharvest_insert_cache( harvester, entry, cache, name, email ); g_free( email ); } hdrBuf = ep; } }