"Fossies" - the Fresh Open Source Software archive

Member "dbox-2.41/online/addrbook.C" of archive dbox-2.41.tgz:


/*

  DBOX Module
  Copyright (C) 1994-2000 Daniel Kroening <kroening@handshake.de>

  Purpose: 

*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <dirent.h>
#include <fcntl.h>
#include <time.h>
#include <sys/stat.h>

#include <dbox.h>
#include <log_serv.h>
#include <oldui.h>
#include <oldtools.h>
#include "online.h"
#include "help.h"
#include "vfolder.h"
#include "readmail.h"
#include "editor.h"
#include "wmail.h"
#include "readnews.h"
#include "addrbook.h"

#define MAXENTRIES 20000

struct indexentryt
 {
  char *email, *description;
 };

static int sort_string(const void *a, const void *b)
 {
  indexentryt *aa, *bb;

  aa=(indexentryt *)a;
  bb=(indexentryt *)b;

  return stricmp(aa->email, bb->email);
 }

class addrbookt:public viewfoldert
 {
 public:
  indexentryt index[MAXENTRIES];

  virtual void readindex();
  virtual void freeindex();
  virtual void displayline(dword line);
  virtual void key(word k);
  virtual void nameeingeben();
  virtual void draw(bool complete);
  virtual void read();
  virtual void help();
  virtual void eintragen();
  virtual void del();

 private:
  void doedit(const char *username);
 };

void addrbookt::readindex()
 {
  char filename[DIRLEN], kennung[1000], text[1000], name[TEXTLEN];
  FILE *infile;

  online.clrscr();
  online.setcursor(1, 1);
  online.printf("Bitte warten...");

  anz=0;

  snprintf(filename, DIRLEN, "%saddrbook", status.userprofile.getpath());
  if((infile=fopen(filename, "rt"))==NULL) return;

 schleife:
  switch(readconfigline(infile, kennung, text, 499))
   {
   case 0:
    if(stricmp(kennung, "email")==0)
     {
      text[TEXTLEN-1]=0;
      index[anz].email=strdup(text);
      if(index[anz].email==NULL)
       {
        log_serv.printf("userverwt::readindex", "FATAL: Zu wenig RAM!");
        return;
       }

      index[anz].description=strdup(name);
      if(index[anz].description==NULL)
       {
        log_serv.printf("userverwt::readindex", "FATAL: Zu wenig RAM!");
        return;
       }

      anz++;
     }
    else if(stricmp(kennung, "name")==0)
     {
      strmaxcpy(name, text, TEXTLEN-1);
     }
    else
     {
      log_serv.printf("addrbook",
        "Unbekannter Eintrag \"%s\" in der addrbook-Datei",
        kennung);
      break;
     }
    goto schleife;

   case 1:
    break;

   default:
    log_serv.printf("addrbook", "Fehler in der addrbook-Datei");
   }

  fclose(infile);

  qsort(index, anz, sizeof(indexentryt), sort_string);
 }

void addrbookt::freeindex()
 {
  dword i;
  for(i=0; i<anz; i++)
   {
    free(index[i].email);
    if(index[i].description!=NULL) free(index[i].description);
   }
 }

void addrbookt::displayline(dword line)
 {
  char tempstr[TEXTLEN*2], tempstr2[TEXTLEN*2];

  if(line>=anz) return;

  strmaxcpy(tempstr2, index[line].email, (TEXTLEN*2)-1);
  tempstr2[40]=0;
  snprintf(tempstr, TEXTLEN, " %-40s ", tempstr2);

  if(index[line].description!=NULL)
    strcat(tempstr, index[line].description);

  viewfoldert::displayline(line, tempstr);
 }

void addrbookt::key(word k)
 {
  char ch=upcase(lo(k));

  switch(ch)
   {
   case '/':
    nameeingeben();
    break;

   case 'E':
    eintragen();
    break;

   default:
    viewfoldert::key(k);
   }
 }

void addrbookt::nameeingeben()
 {
 }

void addrbookt::draw(bool complete)
 {
  snprintf(title, TEXTLEN, "Adressbuch - drcken Sie ? fr Hilfe");
  viewfoldert::draw(complete);
 }

void addrbookt::read()
 {
 }

void addrbookt::doedit(const char *username)
 {
 }

void addrbookt::help()
 {
  displayhelp("addrbook.html");
  if(!status.dologout) draw(TRUE);
 }

void addrbookt::del()
 {
  char tempstr[TEXTLEN];
  omet mes[3];
 
  online.setattr(2, FALSE);
  online.box(20, 8, 60, 16, BOXFRAMEDBL, "Eintrag l”schen", TRUE);

  online.setcursor(25, 10);
  online.printf("E-Mail: ");
  online.setattr(2, TRUE);
  strmaxcpy(tempstr, index[pos].email, 25);
  online.printf("%s", tempstr);
  online.setattr(2, FALSE);
  online.setcursor(28, 12);
  online.printf("Wirklich l”schen?");

  mes[0].type=omet::COMMANDBUTTON;
  mes[0].x=26;
  mes[0].y=14;
  mes[0].key=Key_C_Ent;
  mes[0].sizex=6;
  mes[0].text="O^k";

  mes[1].type=omet::COMMANDBUTTON;
  mes[1].x=43;
  mes[1].y=14;
  mes[1].key=0;
  mes[1].sizex=9;
  mes[1].text="^Abbruch";

  mes[2].type=omet::END_OF_LIST;

 schleife:
  switch(domenu(&online, mes, 1, TRUE))
   {
   case 0:
    break;

   case MENU_HELP:
    goto schleife;
   }

  online.setattr(1, FALSE);

  if(!status.dologout && !reread) draw(TRUE);
 }

void addrbookt::eintragen()
 {
  char email[TEXTLEN]="";
  omet mes[3];

  online.setattr(2, FALSE);
  online.box(20, 10, 60, 16, BOXFRAMEDBL, "Eintrag hinzufgen", TRUE);

  online.setcursor(28, 12);
  online.printf("E-Mail:");

  mes[0].type=omet::EDIT;
  mes[0].key=0;
  mes[0].x=36;
  mes[0].y=12;
  mes[0].sizex=16;
  mes[0].maxlen=40;
  mes[0].text=email;

  mes[1].type=omet::COMMANDBUTTON;
  mes[1].x=26;
  mes[1].y=14;
  mes[1].key=Key_C_Ent;
  mes[1].sizex=6;
  mes[1].text="O^k";

  mes[2].type=omet::COMMANDBUTTON;
  mes[2].x=43;
  mes[2].y=14;
  mes[2].key=0;
  mes[2].sizex=9;
  mes[2].text="^Abbruch";

  mes[3].type=omet::END_OF_LIST;

 schleife:
  switch(domenu(&online, mes, 0, TRUE))
   {
   case 1:
    break;

   case MENU_HELP:
    goto schleife;
   }

  online.setattr(1, FALSE);
  if(!status.dologout && !reread) draw(TRUE);
 }

void addrbook()
 {
  addrbookt *ab=new addrbookt;
  if(ab!=NULL)
   {
    ab->viewfolder();
    delete ab;
   }
 }