#include "AEVAlienUI.h"
#include "AEVAlienUI.c7"
#include "AEVSite.h"
#include <Glasses/ZQueen.h>
#include <Stones/ZComet.h>
#include <TFile.h>
ClassImp(AEVAlienUI);
void AEVAlienUI::_init()
{
mSites = 0;
bConnected = false;
mBDP.init("AEVAlienUI");
}
AEVAlienUI::~AEVAlienUI()
{
if(bConnected) {
mBDP.close_fifos();
}
system(GForm("rm -rf %s", mBDP.fDir.Data()));
}
void AEVAlienUI::AdEnlightenment()
{
PARENT_GLASS::AdEnlightenment();
if(mSites == 0) {
assign_link<ZNameMap>(mSites, FID(), "AliEn Sites",
GForm("AliEn Sites of %s", GetName()));
mSites->SetElementFID(AEVSite::FID());
mSites->SetMIRActive(false);
}
}
void AEVAlienUI::Connect()
{
static const Exc_t _eh("AEVAlienUI::Connect ");
ZMIR* mir = suggest_MIR_presence(_eh, ZGlass::MC_IsFlare);
if(IsSunOrFireSpace()) {
if(bConnected) {
throw(_eh + "already connected.");
}
GMutexHolder ali_lock(hAliEnLock);
mBDP.open_BtoA();
mBDP.read_line();
if(strncmp(mBDP.fRB,"ERR",3) == 0) {
mBDP.read_line();
mBDP.close_fifos();
if(mir) {
throw(_eh + "initialization error: " + mBDP.fRB);
} else {
ISerr(_eh + "initialization error: " + mBDP.fRB);
return;
}
}
mBDP.open_AtoB();
}
bConnected = true;
Stamp(FID());
}
void AEVAlienUI::Disconnect()
{
static const Exc_t _eh("AEVAlienUI::Disconnect ");
suggest_MIR_presence(_eh, ZGlass::MC_IsFlare);
if(IsSunOrFireSpace()) {
if(!bConnected) {
throw(_eh + "not connected.");
}
GMutexHolder ali_lock(hAliEnLock);
mBDP.close_fifos();
}
bConnected = false;
Stamp(FID());
}
void AEVAlienUI::ImportSites(const Text_t* partition)
{
static const Exc_t _eh("AEVAlienUI::ImportSites ");
using namespace AEV_NS;
alien_lock();
int n = mBDP.send_command(GForm("dump_sites\n%s", partition ? partition : ""));
if(n > 0) {
for(int i=0; i<n; ++i) {
AEVSite *_s = new AEVSite, &s = *_s;
s.SetName(mBDP.read_line());
s.SetLocation(mBDP.read_line());
s.SetDomain(mBDP.read_line());
s.SetLatitude(mBDP.read_double());
s.SetLongitude(mBDP.read_double());
if(s.mName.CompareTo(s.mLocation) == 0)
s.SetTitle(s.mName);
else
s.SetTitle(GForm("%s@%s", s.mName.Data(), s.mLocation.Data()));
ZNameMap* l = new ZNameMap("AliEn Sites", GForm("Nests of %s", GetName()));
l->SetElementFID(AEVSite::FID());
mQueen->CheckIn(_s);
try {
mSites->Add(_s);
}
catch(Exc_t& exc) {
mQueen->RemoveLens(_s);
ISerr(_eh + GForm("error inserting site %s (%s).", s.mName.Data(), exc.Data()));
}
}
} else {
printf("ERROR: %s\n", mBDP.fError.Data());
}
alien_unlock();
}
void AEVAlienUI::SaveSites(const Text_t* file)
{
ZComet c("AEVSites");
{
AList::Stepper<> s(*mSites);
while(s.step())
c.AddTopLevel(*s, false, false, 0);
}
TFile f(file, "RECREATE");
c.Write();
f.Close();
}
void AEVAlienUI::LoadSites(const Text_t* file)
{
static const Exc_t _eh("AEVAlienUI::LoadSites ");
mSites->ClearList();
TFile f(file, "READ");
auto_ptr<ZComet> c( dynamic_cast<ZComet*>(f.Get("AEVSites")) );
f.Close();
if(c.get() == 0) {
throw(_eh + "could not read 'AEVSites' from file '" + file + "'.");
}
mQueen->AdoptComet(*mSites, 0, c.get());
}
void AEVAlienUI::FindExCountFilesPerSite(map<string,int>& cmap,
const Text_t* path,
const Text_t* wcard)
{
static const Exc_t _eh("AEVAlienUI::FindEx ");
using namespace AEV_NS;
alien_lock();
int n = mBDP.send_command(GForm("find_ex\n%s\n%s", path, wcard));
if(n > 0) {
printf("%s found %d files ...\n", _eh.Data(), n);
for(int i=0; i<n; ++i) {
string lfn(mBDP.read_line());
string site(mBDP.read_line());
cmap[site]++;
}
} else {
if(mBDP.bError) {
printf("ERROR: %s\n", mBDP.fError.Data());
} else {
printf("No matching files found.\n");
}
}
alien_unlock();
}