1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
// Necessary forward declarations
class DataMover;
//=========================== h_DM Handle class for DataMovers ========================
// Provides memory management, assignment, and copying for DataMover objects
// Also assists in the many network connections of datamover objects.
class h_DM {
friend ostream& operator<<(ostream&, const h_DM&);
friend istream& operator>>(istream&, const h_DM&);
public:
// Empty handle used for children nodes to be assigned later
h_DM() : mDataMover(0), mEmpty(new int(1)), mNumHandles(new std::size_t(0)) { }
// BkupServer or BkupNIC
// type, name, ip, netmask, thruput, nic-thruput
h_DM(const char&, const string&, const string&,
const string&, int tpkb=0, int nictpkb=0);
// BkupClient
// name, ip, netmask, backup-server, thruput
h_DM(const string&, const string&, const string&,
const string&, int tpkb=0);
// BkupNetwork
// name, ip (network), netmask, thruput
h_DM(const string&, const string&, const string&, int tpkb=0);
// StorageVolume
// name, bkupserver, thruput, bkupamt
h_DM(const string&, const string&, int, int);
h_DM(const h_DM&);
~h_DM();
h_DM& operator=(const h_DM&);
DataMover* operator->() const;
operator bool() const { return mDataMover; }
const string& getName() const;
const string& mIsA() const;
int count() const { return *mNumHandles; }
const int DM_id() const;
void setIn(h_DM&);
void setOut(h_DM&);
static const h_DM& getActHand();
static void setActHand(h_DM& h);
private:
static h_DM mActHand;
DataMover* mDataMover;
std::size_t* mNumHandles;
int* mEmpty;
};
//=========================== DataMover Abstract Class ================================
// The base DataMover class
class DataMover {
friend class h_DM;
friend class NetSuper;
friend ostream& operator<<(ostream&, const h_DM&);
friend istream& operator>>(istream&, const h_DM&);
public:
DataMover(const string& n, const string& i) :
mID(++mNumHandles), mName(n), mIsA(i) { }
virtual ~DataMover() { }
const string& getName() const { return mName; }
const int getid() const { return mID; }
const int getThruput() { return mThruput; }
void setThruput(int tpkb);
virtual Net& getNet(int n=0) = 0;
virtual const string& getip_str(int n=0) = 0;
virtual void setip(const string&, int nn=0) = 0;
virtual void setnm(const string&, int nn=0) = 0;
virtual h_DM& addStgV(const string&, int, int) = 0;
virtual h_DM& addNIC(const string&, const string&, int tpkb=0) = 0;
virtual void handleMsg(Msg& m);
protected:
virtual map<Net, h_DM>::iterator findNetNode(const Net&) = 0;
virtual map<Net, h_DM>::iterator addNode(const Net&, const h_DM&) = 0;
virtual map<Net, h_DM>::iterator node_list_end() = 0;
virtual map<Net, h_DM>::iterator node_list_begin() = 0;
virtual void print(ostream& o) const;
private:
string mName;
int mThruput;
h_DM mIn;
h_DM mOut;
string mIsA;
static int mNumHandles;
int mID;
};
//=========================== h_DM function defines ======================================
h_DM::h_DM(const char& t, const string& n, const string& a, const string& nm,
int tpkb, int nictpkb) : mEmpty(new int(0)), mNumHandles(new std::size_t(1)) {
switch(t) {
case 'S':
mDataMover = new BkupServer(n, a, nm, tpkb, nictpkb);
h_DM::setActHand(*this);
break;
case 'N':
// tpkb is the parent id
mDataMover = new BkupNIC(n, a, nm, tpkb, nictpkb);
NetSuper::regNode(*this);
break;
}
}
h_DM::h_DM(const string& n, const string& a, const string& bs, const string& nm,
int tpkb) : mEmpty(new int(0)), mNumHandles(new std::size_t(1)) {
mDataMover = new BkupClient(n, a, bs, nm, tpkb);
}
h_DM::h_DM(const string& n, const string& a, const string& nm,
int tpkb) : mEmpty(new int(0)), mNumHandles(new std::size_t(1)) {
mDataMover = new BkupNetwork(n, a, nm, tpkb);
NetSuper::regNetwork(*this);
}
h_DM::h_DM(const string& n, const string& bkupsrv, int tpkb, int bkupamt) :
mEmpty(new int(0)), mNumHandles(new std::size_t(1)) {
mDataMover = new StorageVolume(n, bkupsrv, tpkb, bkupamt);
}
h_DM::h_DM(const h_DM& copy) {
if(*copy.mEmpty == 1)
throw std::runtime_error("h_DM(h_DM&): Cannot copy empty handle.");
mDataMover=copy.mDataMover;
mNumHandles=copy.mNumHandles;
mEmpty=copy.mEmpty;
++*mNumHandles;
}
h_DM::~h_DM() {
if(--*mNumHandles == 0 && *mEmpty == 0) {
delete mDataMover;
delete mNumHandles;
delete mEmpty;
}
}
h_DM& h_DM::operator=(const h_DM& rhs) {
if(*rhs.mEmpty == 1)
throw std::runtime_error("h_DM::operator=(): Cannot assign empty handle.");
++*rhs.mNumHandles;
*rhs.mEmpty=0;
if(--*mNumHandles == 0) {
delete mDataMover;
delete mNumHandles;
delete mEmpty;
}
else if(*mEmpty==1) {
delete mNumHandles;
delete mEmpty;
}
mDataMover = rhs.mDataMover;
mNumHandles=rhs.mNumHandles;
return *this;
}
inline DataMover* h_DM::operator->() const {
if(mDataMover)
return mDataMover;
throw std::runtime_error("h_DM(): Unbound handle.");
}
const string& h_DM::getName() const { return mDataMover->getName(); }
const int h_DM::DM_id() const { return mDataMover->getid(); }
const string& h_DM::mIsA() const { return mDataMover->mIsA; }
void h_DM::setIn(h_DM& i) { mDataMover->mIn=i; }
void h_DM::setOut(h_DM& o) { mDataMover->mOut=o; }
const h_DM& h_DM::getActHand() { return mActHand; }
void h_DM::setActHand(h_DM& h) { mActHand = h; }
|