/*
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