mcabber/src/hbuf.c
changeset 1485 0121b6f3047c
parent 1424 bb1cc8902d0e
child 1486 f83a51eaa5ed
equal deleted inserted replaced
1484:7b36b91a4388 1485:0121b6f3047c
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
    18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
    19  * USA
    19  * USA
    20  */
    20  */
    21 
    21 
    22 #include <string.h>
    22 #include <string.h>
       
    23 #include <sys/types.h>
       
    24 #include <sys/stat.h>
       
    25 #include <unistd.h>
    23 
    26 
    24 #include "hbuf.h"
    27 #include "hbuf.h"
    25 #include "utils.h"
    28 #include "utils.h"
    26 #include "utf8.h"
    29 #include "utf8.h"
       
    30 #include "screen.h"
    27 
    31 
    28 
    32 
    29 /* This is a private structure type */
    33 /* This is a private structure type */
    30 
    34 
    31 typedef struct {
    35 typedef struct {
   327   array_elt = array;
   331   array_elt = array;
   328 
   332 
   329   for (i = 0 ; i < n ; i++) {
   333   for (i = 0 ; i < n ; i++) {
   330     if (hbuf) {
   334     if (hbuf) {
   331       int maxlen;
   335       int maxlen;
       
   336 
   332       blk = (hbuf_block*)(hbuf->data);
   337       blk = (hbuf_block*)(hbuf->data);
   333       maxlen = blk->ptr_end - blk->ptr;
   338       maxlen = blk->ptr_end - blk->ptr;
   334       *array_elt = (hbb_line*)g_new(hbb_line, 1);
   339       *array_elt = (hbb_line*)g_new(hbb_line, 1);
   335       (*array_elt)->timestamp  = blk->prefix.timestamp;
   340       (*array_elt)->timestamp  = blk->prefix.timestamp;
   336       (*array_elt)->flags      = blk->prefix.flags;
   341       (*array_elt)->flags      = blk->prefix.flags;
   342       } else {
   347       } else {
   343         // Propagate highlighting flags
   348         // Propagate highlighting flags
   344         (*array_elt)->flags |= last_persist_prefixflags &
   349         (*array_elt)->flags |= last_persist_prefixflags &
   345                                (HBB_PREFIX_HLIGHT_OUT | HBB_PREFIX_HLIGHT |
   350                                (HBB_PREFIX_HLIGHT_OUT | HBB_PREFIX_HLIGHT |
   346                                 HBB_PREFIX_INFO | HBB_PREFIX_IN);
   351                                 HBB_PREFIX_INFO | HBB_PREFIX_IN);
   347         //Continuation of a message - omit the prefix
   352         // Continuation of a message - omit the prefix
   348         (*array_elt)->flags |= HBB_PREFIX_CONT;
   353         (*array_elt)->flags |= HBB_PREFIX_CONT;
   349         (*array_elt)->mucnicklen = 0;//The nick is in the first one
   354         (*array_elt)->mucnicklen = 0; // The nick is in the first one
   350       }
   355       }
   351 
   356 
   352       hbuf = g_list_next(hbuf);
   357       hbuf = g_list_next(hbuf);
   353     } else
   358     } else
   354       break;
   359       break;
   410   hlen = g_list_length(hbuf);
   415   hlen = g_list_length(hbuf);
   411 
   416 
   412   return g_list_nth(hbuf, pc*hlen/100);
   417   return g_list_nth(hbuf, pc*hlen/100);
   413 }
   418 }
   414 
   419 
       
   420 //  hbuf_dump_to_file(hbuf, filename)
       
   421 // Save the buffer to a file.
       
   422 void hbuf_dump_to_file(GList *hbuf, const char *filename)
       
   423 {
       
   424   hbuf_block *blk;
       
   425   hbb_line line;
       
   426   guint last_persist_prefixflags;
       
   427   char pref[96];
       
   428   FILE *fp;
       
   429   struct stat statbuf;
       
   430 
       
   431   if (!stat(filename, &statbuf)) {
       
   432     scr_LogPrint(LPRINT_NORMAL, "The file already exists.");
       
   433     return;
       
   434   }
       
   435   fp = fopen(filename, "w");
       
   436   if (!fp) {
       
   437     scr_LogPrint(LPRINT_NORMAL, "Unable to open the file.");
       
   438     return;
       
   439   }
       
   440 
       
   441   for (hbuf = g_list_first(hbuf); hbuf; hbuf = g_list_next(hbuf)) {
       
   442     int maxlen;
       
   443 
       
   444     blk = (hbuf_block*)(hbuf->data);
       
   445     maxlen = blk->ptr_end - blk->ptr;
       
   446 
       
   447     memset(&line, 0, sizeof(line));
       
   448     line.timestamp  = blk->prefix.timestamp;
       
   449     line.flags      = blk->prefix.flags;
       
   450     line.mucnicklen = blk->prefix.mucnicklen;
       
   451     line.text       = g_strndup(blk->ptr, maxlen);
       
   452 
       
   453     if ((blk->flags & HBB_FLAG_PERSISTENT) && blk->prefix.flags) {
       
   454       last_persist_prefixflags = blk->prefix.flags;
       
   455     } else {
       
   456       // Propagate highlighting flags
       
   457       line.flags |= last_persist_prefixflags &
       
   458                     (HBB_PREFIX_HLIGHT_OUT | HBB_PREFIX_HLIGHT |
       
   459                      HBB_PREFIX_INFO | HBB_PREFIX_IN);
       
   460       // Continuation of a message - omit the prefix
       
   461       line.flags |= HBB_PREFIX_CONT;
       
   462       line.mucnicklen = 0; // The nick is in the first one
       
   463     }
       
   464 
       
   465     scr_line_prefix(&line, pref, sizeof pref);
       
   466     fprintf(fp, "%s%s\n", pref, line.text);
       
   467   }
       
   468 
       
   469   fclose(fp);
       
   470   return;
       
   471 }
       
   472 
   415 //  hbuf_get_blocks_number()
   473 //  hbuf_get_blocks_number()
   416 // Returns the number of allocated hbuf_block's.
   474 // Returns the number of allocated hbuf_block's.
   417 guint hbuf_get_blocks_number(GList *hbuf)
   475 guint hbuf_get_blocks_number(GList *hbuf)
   418 {
   476 {
   419   hbuf_block *hbuf_b_elt;
   477   hbuf_block *hbuf_b_elt;