/*

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

  Purpose: 

*/

#include <iostream>
#include <fstream>

#include <stringtools.h>
#include <lock.h>
#include "dboximap4.h"
#include "mod-utf7.h"

void dboximap4t::dosubscribe(bool subscribe)
 {
  if(arguments.size()!=1)
   {
    std::cout << tag << " NO wrong number of arguments\r\n";
    command_ok=FALSE;
    return;
   }  

  std::string mailbox_name=decode_mod_utf7(arguments[0].data);

  if(lock("folders", up.name, config.boxname, "dboximap4t::dosubscribe"))
   {
    std::cout << tag << " NO folder list is locked\r\n";
    command_ok=FALSE;
    return;
   }

  get_folder_list();

  unsigned i;
  for(i=0; i<folders.size(); i++)
    if(mailbox_name==folders[i].name)
      break;

  if(i==folders.size())
   {
    unlock("folders", up.name, config.boxname);
    std::cout << tag << " NO no such mailbox\r\n";
    command_ok=FALSE;
    return;
   }

  if(folders[i].subscribed!=subscribe)
   {
    folders[i].subscribed=subscribe;

    std::string outfilename=up.getpath();
    outfilename+="subscribed";
    std::ofstream out(outfilename.c_str(), ios::out|ios::trunc);

    for(i=0; i<folders.size(); i++)
      if(folders[i].subscribed)
        out << 'F' << i << "\n";
   }

  unlock("folders", up.name, config.boxname);
 }

void dboximap4t::get_folder_list()
 {
  std::string filename=up.getpath();
  filename+="folders";

  folders.clear();
  std::ifstream in(filename.c_str());

  if(!in)
   {
    folder_et folder_e;
    folder_e.name="INBOX";
    folder_e.subscribed=TRUE;
    folders.push_back(folder_e);
   }
  else
   {
    char line[TEXTLEN], *tptr, ch;

    while(in.get(line, TEXTLEN-1))
     {
      in.get(ch); // read \n
      tptr=strchr(line, '\n'); if(tptr!=NULL) *tptr=0;
      tptr=strchr(line, '\r'); if(tptr!=NULL) *tptr=0;

      folder_et folder_e;
      folder_e.name=line;
      folders.push_back(folder_e);
     }
   }

  get_subscribed();
 }

void dboximap4t::get_subscribed()
 {
  std::string filename=up.getpath();
  filename+="subscribed";

  std::ifstream in(filename.c_str());

  if(!in) return;

  char line[TEXTLEN], *tptr, ch;

  while(in.get(line, TEXTLEN-1))
   {
    in.get(ch); // read \n
    tptr=strchr(line, '\n'); if(tptr!=NULL) *tptr=0;
    tptr=strchr(line, '\r'); if(tptr!=NULL) *tptr=0;

    if(line[0]=='F')
     {
      unsigned i=atol(line+1);
      if(i<folders.size())
        folders[i].subscribed=TRUE;
     }
   }
 }

bool dboximap4t::matchfolder(const std::string &mask, const std::string &folder)
 {
  return matchfolder(mask.c_str(), folder.c_str());
 }

bool dboximap4t::matchfolder(const char *mask, const char *folder)
 {
  while(*mask!=0)
   {
    switch(*mask)
     {
     case '*':
      mask++;
      if(*mask==0) return TRUE;
      while(*folder!=0)
       {
        if(matchfolder(mask, folder)) return TRUE;
        folder++;
       }
      return FALSE;

     case '%':
      mask++;

      if(*mask==0)
       {
        for(; *folder!=0; folder++)
          if(*folder=='/') return FALSE;
        return TRUE;
       }

      while(*folder!=0)
       {
        if(matchfolder(mask, folder)) return TRUE;
        if(*folder=='/') return FALSE;
        folder++;
       }
      return FALSE;

     default:
      if(*mask!=*folder)
        return FALSE;

      folder++;
     }

    mask++;
   }

  return (*folder==0);
 }

void dboximap4t::dolsublist()
 {
  bool lsub=(stringcasecmp(command, "LSUB")==0);

  if(arguments.size()!=2)
   {
    std::cout << tag << " NO please give arguments\r\n";
    command_ok=FALSE;
    return;
   }

  if(arguments[1].data=="")
   {
    std::cout << "* " << command << " (\\Noselect) \"/\" \"\"\r\n";
   }
  else
   {
    get_folder_list();

    for(unsigned i=0; i<folders.size(); i++)
      if((folders[i].name!="") &&
         (folders[i].subscribed || !lsub))
       {
        std::string foldername=encode_mod_utf7(folders[i].name);

        if(matchfolder(arguments[1].data, foldername))
         {
          folder_grantst grants;
          char subfolder[TEXTLEN];
          snprintf(subfolder, TEXTLEN, "%u", i);

          ::get_folder_grants(up.name, subfolder, up, gp, grants);
          if(grants.lookup)
           {
            std::cout << "* " << command << " () \"/\" ";
            send_string(foldername);
            std::cout << "\r\n";
           }
         }
       }
   }

  command_ok=TRUE;
 }



syntax highlighted by Code2HTML, v. 0.9.1