mif_PartMgr Class Reference
[G_new_group]

#include <mif_partmgr.h>

Collaboration diagram for mif_PartMgr:

Collaboration graph
[legend]

List of all members.


Detailed Description

Definition at line 50 of file mif_partmgr.h.


Public Member Functions

 mif_PartMgr ()
virtual ~mif_PartMgr ()
void SetMif (i_ManagementInterface_i *a_iMIF)
void AddPart (const string &a_partName, const string &a_partUUID, const string &a_host, const string &a_fsID)
void UpdatePart (const string &a_partName, const string &a_host, const string &a_fsID)
void RemovePart (const string &a_partName)
void EnablePart (const string &a_partName)
void DisablePart (const string &a_partName)
mif_PartEntry GetPart (const string &a_partName)
vector< mif_PartEntryGetAllPart ()
void GetAllPartFromRM ()
void StartAllPart ()
void StopAllPart ()
void GetClientFSIDs (const string &a_clientHost, i_StringList_t &a_list)
bool IsInRecallOnlyMode (const string &a_partName)

Private Member Functions

vector< mif_PartEntry >::iterator Find (const string &a_partName)
void StartPM (vector< mif_PartEntry >::iterator a_iter)
void StopPM (vector< mif_PartEntry >::iterator a_iter)
void GetFSIDs (const string &a_clientHost, i_StringList_t &a_list)
void SendClientFSIDs (const string &a_clientHost)

Private Attributes

vector< mif_PartEntrym_partList
cmn_Mutex m_partList_x
i_ManagementInterface_im_iMIF
 log_CLASSID_m

Constructor & Destructor Documentation

mif_PartMgr::mif_PartMgr (  ) 

Definition at line 37 of file mif_partmgr.cpp.

00037                         :
00038     m_iMIF(NULL) {
00039     // empty    
00040 }

mif_PartMgr::~mif_PartMgr (  )  [virtual]

Definition at line 42 of file mif_partmgr.cpp.

00042                           {
00043 }


Member Function Documentation

vector< mif_PartEntry >::iterator mif_PartMgr::Find ( const string &  a_partName  )  [private]

Definition at line 46 of file mif_partmgr.cpp.

References ie_FATAL_ERROR, ie_NOTFOUND, ivd_Error, log_FUNC_m, m_iMIF, m_partList, and NULL.

Referenced by AddPart(), DisablePart(), EnablePart(), GetPart(), IsInRecallOnlyMode(), RemovePart(), and UpdatePart().

00046                                                                         {
00047 
00048     log_FUNC_m(Find);
00049     if (m_iMIF == NULL){
00050         throw ivd_InternalError(ie_FATAL_ERROR, "MIF pointer not set.");
00051     }
00052     
00053     for (vector<mif_PartEntry>::iterator iter = m_partList.begin();
00054          iter != m_partList.end();
00055          ++iter) {
00056 
00057         if (iter->m_partName == a_partName) {
00058             return iter;
00059         }
00060     }
00061 
00062     throw ivd_Error(ie_NOTFOUND, "Cannot find partition.");
00063 }

Here is the caller graph for this function:

void mif_PartMgr::StartPM ( vector< mif_PartEntry >::iterator  a_iter  )  [private]

Definition at line 66 of file mif_partmgr.cpp.

References dbg_NORM, g_cmn, i_IVDPM, ie_MIF_PARTITION_MGR, ipc_EXEC_m, ivd_Error, log_DBG_m, log_FUNC_m, m_iMIF, cmn_SysInfo::m_serverHost, i_ManagementInterface_i::m_svc, mps_Online, mps_Stopped, ipc_Corba::ResolvePMByPartID(), and cmn_Global::si.

Referenced by AddPart(), EnablePart(), and StartAllPart().

00066                                                               {
00067     log_FUNC_m(StartPM);
00068 
00069     ipc_EXEC_m(
00070         try {
00071             bool isActive(false);
00072 
00073             // check if PM already running
00074             try { 
00075                 ipc_EXEC_m(
00076                     CORBA::Object_var obj = ipc_Corba::ResolvePMByPartID(
00077                         g_cmn.si.m_serverHost, a_iter->m_partName, false);
00078                     i_PartitionManager_var p = i_PartitionManager::_narrow(obj);
00079                     isActive = true;
00080                 )
00081             }
00082             catch (ivd_Exception) {
00083                 isActive = false;
00084             }
00085 
00086             if (isActive) {
00087                 throw ivd_Error(ie_MIF_PARTITION_MGR, 
00088                                 "Can not start partition, already running");    
00089             }
00090 
00091             i_StringList_t argSequence;
00092             argSequence.length(2);
00093             argSequence[0] = CORBA::string_dup("--name");
00094             argSequence[1] = CORBA::string_dup(a_iter->m_partName.c_str());
00095             ipc_EXEC_m(
00096                 m_iMIF->m_svc->Execute(i_IVDPM, argSequence);
00097             );
00098             log_DBG_m(dbg_NORM, "MIF: HSM-PM for partition " 
00099                       << a_iter->m_partName << " started.");
00100 
00101 
00102             CORBA::Object_var obj = ipc_Corba::ResolvePMByPartID(
00103                         g_cmn.si.m_serverHost, a_iter->m_partName, true);
00104             a_iter->m_iPM = i_PartitionManager::_narrow(obj);
00105             a_iter->m_partStatus = mps_Online;
00106         }
00107         catch (...) {
00108             a_iter->m_partStatus = mps_Stopped;
00109             a_iter->m_iPM = i_PartitionManager::_nil();
00110         }
00111     );
00112 } // mif_PartMgr::StartPM()

Here is the call graph for this function:

Here is the caller graph for this function:

void mif_PartMgr::StopPM ( vector< mif_PartEntry >::iterator  a_iter  )  [private]

Definition at line 115 of file mif_partmgr.cpp.

References ipc_EXEC_m, and log_FUNC_m.

Referenced by DisablePart(), RemovePart(), and StopAllPart().

00115                                                              {
00116     log_FUNC_m(StopPM);
00117 
00118     try {
00119         ipc_EXEC_m(
00120             if (a_iter->m_iPM != i_PartitionManager::_nil()){
00121                 a_iter->m_iPM->Remove();
00122                 CORBA::release(a_iter->m_iPM);
00123             }
00124         );
00125     } catch (ivd_Error& e){
00126         // just log this error and continue
00127         log_ERR_m(e);
00128     }
00129 
00130     a_iter->m_partStatus = mps_Stopped;
00131     a_iter->m_iPM = i_PartitionManager::_nil();
00132 }

Here is the caller graph for this function:

void mif_PartMgr::GetFSIDs ( const string &  a_clientHost,
i_StringList_t a_list 
) [private]

Definition at line 420 of file mif_partmgr.cpp.

References dbg_NORM, log_DBG_m, log_FUNC_m, m_partList, and mps_Disabled.

Referenced by GetClientFSIDs(), and SendClientFSIDs().

00420                                                                              {
00421     log_FUNC_m(GetFSIDs);
00422 
00423     for (UInt32_t i=0; i < m_partList.size(); ++i) {
00424 
00425         // only if partition online/enabled and host matches
00426         if (m_partList[i].m_partStatus != mps_Disabled
00427             && m_partList[i].m_partHost == a_clientHost) {
00428 
00429             log_DBG_m(dbg_NORM, "Client: " << a_clientHost << 
00430                                 " FS: " << m_partList[i].m_partFSID);
00431 
00432             a_list.length(a_list.length()+1);
00433             a_list[a_list.length()-1] = 
00434                 CORBA::string_dup(m_partList[i].m_partFSID.c_str());
00435         }
00436     }
00437 }

Here is the caller graph for this function:

void mif_PartMgr::SendClientFSIDs ( const string &  a_clientHost  )  [private]

Definition at line 440 of file mif_partmgr.cpp.

References dbg_NORM, GetFSIDs(), log_DBG_m, log_ERR_m, log_FUNC_m, and ipc_Corba::ResolveFSEvtMgr().

Referenced by AddPart(), DisablePart(), EnablePart(), RemovePart(), and UpdatePart().

00440                                                             {
00441     log_FUNC_m(SendClientFSIDs);
00442 
00443     i_StringList_t list;
00444     GetFSIDs(a_clientHost, list);
00445 
00446     // now try to send list of FS IDs to client
00447     i_FsEvMgr_var iFSE;
00448     try {
00449         CORBA::Object_var obj = ipc_Corba::ResolveFSEvtMgr(a_clientHost.c_str(),
00450                                                         false);
00451         iFSE = i_FsEvMgr::_narrow(obj);
00452     }
00453     catch (...) {
00454         // ignore error and check next one...
00455         log_DBG_m(dbg_NORM, "Warning: cannot resolve FSE: " << 
00456                   a_clientHost);
00457         iFSE = i_FsEvMgr::_nil();
00458     }
00459 
00460     if (!CORBA::is_nil(iFSE)) {
00461         try {
00462             iFSE->SetFSList(list);
00463         }
00464         catch(...) {
00465             // ignore - try to do us much as possible
00466             log_ERR_m("Could not send FS IDs to FSE: " << a_clientHost);
00467         }
00468     }
00469     else {
00470         log_ERR_m("Could not send FS IDs to FSE (down): " << a_clientHost);
00471     }
00472 }

Here is the call graph for this function:

Here is the caller graph for this function:

void mif_PartMgr::SetMif ( i_ManagementInterface_i a_iMIF  )  [inline]

Definition at line 74 of file mif_partmgr.h.

References m_iMIF.

Referenced by i_ManagementInterface_i::i_ManagementInterface_i().

00074                                                    {
00075                 m_iMIF = a_iMIF;
00076             }

Here is the caller graph for this function:

void mif_PartMgr::AddPart ( const string &  a_partName,
const string &  a_partUUID,
const string &  a_host,
const string &  a_fsID 
)

Definition at line 135 of file mif_partmgr.cpp.

References dbg_NORM, Find(), ie_MIF_PARTITION_MGR, ivd_Error, log_DBG_m, log_FUNC_m, mif_PartEntry::m_partFSID, mif_PartEntry::m_partHost, m_partList, m_partList_x, mif_PartEntry::m_partName, mif_PartEntry::m_partStatus, mif_PartEntry::m_partUUID, mps_Stopped, SendClientFSIDs(), and StartPM().

Referenced by i_ManagementInterface_i::AddPartition().

00136                                                                       {
00137     log_FUNC_m(AddPart);
00138 
00139     cmn_MutexLock l(m_partList_x);
00140 
00141     try {
00142         // verify that entry does not exist already
00143         Find(a_partName);
00144     }
00145     catch (...) {
00146         // not found -> add to list
00147         mif_PartEntry pe;
00148 
00149         pe.m_partName = a_partName;
00150         pe.m_partUUID = a_partUUID;
00151         pe.m_partHost = a_host;
00152         pe.m_partFSID = a_fsID;
00153         pe.m_partStatus = mps_Stopped; // StartPM() will update this
00154 
00155         log_DBG_m(dbg_NORM, "partName: " << pe.m_partName << endl
00156                   << "  partHost: " << pe.m_partHost << endl 
00157                   << "  partFSID: " << pe.m_partFSID << endl);
00158         m_partList.push_back(pe);
00159 
00160         // start Partition Manager
00161         StartPM(--m_partList.end()); 
00162 
00163         // notify client about new FS ID
00164         SendClientFSIDs(a_host);
00165 
00166         return;
00167     }
00168 
00169     // Find() succeded - partition exist
00170     throw ivd_Error(ie_MIF_PARTITION_MGR, "Cannot add partition - duplicate"); 
00171 }

Here is the call graph for this function:

Here is the caller graph for this function:

void mif_PartMgr::UpdatePart ( const string &  a_partName,
const string &  a_host,
const string &  a_fsID 
)

Definition at line 174 of file mif_partmgr.cpp.

References dbg_NORM, Find(), ivd_BaseException::GetFriendly(), ie_MIF_PARTITION_MGR, ipc_EXEC_m, ivd_Error, log_DBG_m, log_FUNC_m, m_partList_x, mps_Online, and SendClientFSIDs().

Referenced by i_ManagementInterface_i::UpdatePartition().

00175                                                                          {
00176     log_FUNC_m(UpdatePart);
00177 
00178     cmn_MutexLock l(m_partList_x);
00179 
00180     vector<mif_PartEntry>::iterator iter = Find(a_partName);
00181   
00182     // check if FS ID changed: has to notify client
00183     bool changedFSID(false);
00184     if (iter->m_partFSID != a_fsID) {
00185         iter->m_partFSID = a_fsID;
00186         changedFSID = true;
00187     }
00188 
00189     // check if client name changed: has to notify old client also
00190     string oldHost;
00191     if (iter->m_partHost != a_host) {
00192         iter->m_partHost = a_host;
00193         oldHost = iter->m_partHost; // save old hostname for update
00194     }
00195 
00196     log_DBG_m(dbg_NORM, "partName: " << iter->m_partName << endl
00197               << "  partHost: " << iter->m_partHost << endl 
00198               << "  partFSID: " << iter->m_partFSID << endl);
00199 
00200     if (iter->m_partStatus == mps_Online) {
00201         // update partition manager configuration (re-read)
00202         try {
00203             ipc_EXEC_m(
00204                 iter->m_iPM->RefreshCfg();
00205             );
00206         }
00207         catch (ivd_Exception &ex) {
00208             throw ivd_Error(ie_MIF_PARTITION_MGR, 
00209                             "Cannot reconfigure Partition Manager: " + 
00210                             ex.GetFriendly());
00211         }
00212         log_DBG_m(dbg_NORM, "Partition manager " << a_partName << 
00213                             " refreshed configuration.");
00214     }
00215 
00216     // if host changed: notify old client about removed FS ID
00217     if (!oldHost.empty()) {
00218         SendClientFSIDs(oldHost);
00219     }
00220 
00221     // if host or FSID changed: notify old client about removed FS ID
00222     if (changedFSID || !oldHost.empty()) {
00223         // notify client about new FS ID
00224         SendClientFSIDs(iter->m_partHost);
00225     }
00226 } // mif_PartMgr::UpdatePart()

Here is the call graph for this function:

Here is the caller graph for this function:

void mif_PartMgr::RemovePart ( const string &  a_partName  ) 

Definition at line 229 of file mif_partmgr.cpp.

References dbg_LOW, Find(), log_DBG_m, log_FUNC_m, m_partList, m_partList_x, mps_Online, SendClientFSIDs(), and StopPM().

Referenced by i_ManagementInterface_i::RemovePartition().

00229                                                      {
00230     log_FUNC_m(RemovePart);
00231 
00232     cmn_MutexLock l(m_partList_x);
00233 
00234     vector<mif_PartEntry>::iterator iter = Find(a_partName);
00235 
00236     if (iter->m_partStatus == mps_Online) {
00237         try {
00238             StopPM(iter);
00239         }
00240         catch (ivd_Exception &e) {
00241             log_DBG_m(dbg_LOW, "Cannot stop PM: " << iter->m_partName 
00242                 << " - ignored: " << e);
00243         }
00244     }
00245 
00246     // remove from partition list
00247     string host(iter->m_partHost);
00248     m_partList.erase(iter);
00249 
00250     // notify client about removed FS ID
00251     SendClientFSIDs(host);
00252 }

Here is the call graph for this function:

Here is the caller graph for this function:

void mif_PartMgr::EnablePart ( const string &  a_partName  ) 

Definition at line 255 of file mif_partmgr.cpp.

References Find(), ie_PRECONDITION, ivd_Error, log_FUNC_m, m_partList_x, mps_Online, mps_Stopped, SendClientFSIDs(), and StartPM().

Referenced by i_ManagementInterface_i::EnablePartition().

00255                                                      {
00256     log_FUNC_m(EnablePart);
00257 
00258     cmn_MutexLock l(m_partList_x);
00259 
00260     vector<mif_PartEntry>::iterator iter = Find(a_partName);
00261 
00262     if (iter->m_partStatus == mps_Online){
00263         throw ivd_Error(ie_PRECONDITION, 
00264                         "Partition can not be enabled, it is already running.");
00265     } else {
00266         // mark status as stopped (will start later)
00267         iter->m_partStatus = mps_Stopped;
00268     }
00269 
00270     // start Partition Manager
00271     StartPM(iter);
00272 
00273     // notify client about enabled FS ID
00274     SendClientFSIDs(iter->m_partHost);
00275 
00276     // TODO: should we update RMDB also here?
00277 }

Here is the call graph for this function:

Here is the caller graph for this function:

void mif_PartMgr::DisablePart ( const string &  a_partName  ) 

Definition at line 280 of file mif_partmgr.cpp.

References dbg_LOW, Find(), log_DBG_m, log_FUNC_m, m_partList_x, mps_Disabled, SendClientFSIDs(), and StopPM().

Referenced by i_ManagementInterface_i::DisablePartition().

00280                                                       {
00281     log_FUNC_m(DisablePart);
00282 
00283     cmn_MutexLock l(m_partList_x);
00284 
00285     vector<mif_PartEntry>::iterator iter = Find(a_partName);
00286 
00287     // stop Partition Manager
00288     try {
00289         StopPM(iter);
00290     }
00291     catch (ivd_Exception &e) {
00292         log_DBG_m(dbg_LOW, "Cannot stop PM: " << iter->m_partName 
00293             << " - ignored: " << e);
00294     }
00295 
00296     // mark status as disabled
00297     iter->m_partStatus = mps_Disabled;
00298 
00299     // notify client about disabled FS ID
00300     SendClientFSIDs(iter->m_partHost);
00301 
00302     // TODO: should we update RMDB also here?
00303 }

Here is the call graph for this function:

Here is the caller graph for this function:

mif_PartEntry mif_PartMgr::GetPart ( const string &  a_partName  ) 

vector<mif_PartEntry> mif_PartMgr::GetAllPart (  )  [inline]

void mif_PartMgr::GetAllPartFromRM (  ) 

Definition at line 316 of file mif_partmgr.cpp.

References dbg_LOW, dbg_NORM, ipc_EXEC_m, log_DBG_m, log_FUNC_m, m_iMIF, mif_PartEntry::m_iPM, mif_PartEntry::m_partFSID, mif_PartEntry::m_partFSMountPoint, mif_PartEntry::m_partHost, m_partList, m_partList_x, mif_PartEntry::m_partName, mif_PartEntry::m_partStatus, mif_PartEntry::m_partUUID, i_ManagementInterface_i::m_rm, mps_Disabled, mps_Stopped, partitionName, and rmdb_PARTITION_DISABLED.

Referenced by i_ManagementInterface_i::i_ManagementInterface_i().

00316                                    {
00317     log_FUNC_m(GetAllPartFromRM);
00318 
00319     cmn_MutexLock l(m_partList_x);
00320 
00321     // we will re-read all info about partitions from RMDB & CfgDB -> clear all
00322     m_partList.clear();
00323 
00324     i_PartSeq_t_var partSeq;
00325     try {
00326         ipc_EXEC_m(
00327             partSeq = m_iMIF->m_rm->SelectAllPartition();
00328         );
00329     }
00330     catch (ivd_Exception) {
00331         log_DBG_m(dbg_LOW, "No partitions found?");
00332         return;
00333     }
00334 
00335     for (UInt32_t i = 0; i < partSeq->length(); i++) {
00336         
00337         mif_PartEntry pe;
00338 
00339         log_DBG_m(dbg_LOW, "Found PM: " << partSeq[i].partitionName <<
00340             " fsID: " << partSeq[i].fsID);
00341 
00342         // set default value to pe element
00343         // TODO: move this to CTOR of mif_PartEntry
00344         pe.m_partName = partSeq[i].partitionName;
00345         pe.m_iPM = i_PartitionManager::_nil();
00346         pe.m_partStatus = mps_Stopped;
00347 
00348         if ((partSeq[i].status & rmdb_PARTITION_DISABLED)  
00349             == rmdb_PARTITION_DISABLED) {
00350                 log_DBG_m(dbg_LOW, "Partition disabled");
00351                 pe.m_partStatus = mps_Disabled;
00352         }
00353 
00354         // get client hostname and FS ID from configuration file
00355         // mif_Partition partition(m_iMIF, pe.m_partName);
00356         // partition.GetClientInfo(pe.m_partHost, pe.m_partFSID);
00357 
00358         // if fsID is empty update it with proper values 1.2->2.0 upgrade
00359         if (string(partSeq[i].fsID).empty()){
00360             ipc_EXEC_m(
00361                 m_iMIF->m_rm->UpdatePartition(partSeq[i].partitionName);
00362                 i_Partition_t_var pNew = m_iMIF->m_rm->SelectPartition(partSeq[i].partitionName);
00363                 pe.m_partFSMountPoint = pNew->fsMountpoint;
00364                 pe.m_partHost = pNew->fsHost;
00365                 pe.m_partFSID = pNew->fsID;
00366                 pe.m_partUUID = pNew->partitionUUIDString;
00367             );
00368         } else {
00369             pe.m_partFSMountPoint = partSeq[i].fsMountpoint;
00370             pe.m_partHost = partSeq[i].fsHost;
00371             pe.m_partFSID = partSeq[i].fsID;
00372             pe.m_partUUID = partSeq[i].partitionUUIDString;
00373         }
00374 
00375 
00376         // add partition to list of partitions
00377         log_DBG_m(dbg_NORM, "partName: " << pe.m_partName << endl
00378             << "  partHost: " << pe.m_partHost << endl 
00379             << "  partFSID: " << pe.m_partFSID << endl);
00380         m_partList.push_back(pe);
00381     }
00382 } // mif_PartMgr::GetAllPartFromRM()

Here is the caller graph for this function:

void mif_PartMgr::StartAllPart (  ) 

Definition at line 384 of file mif_partmgr.cpp.

References dbg_LOW, log_DBG_m, log_FUNC_m, m_partList, m_partList_x, mps_Disabled, and StartPM().

Referenced by i_ManagementInterface_i::i_ManagementInterface_i().

00384                                {
00385     log_FUNC_m(StartAllPart);
00386 
00387     cmn_MutexLock l(m_partList_x);
00388 
00389     vector<mif_PartEntry>::iterator iter;
00390     for (iter = m_partList.begin(); iter != m_partList.end(); ++iter){
00391         log_DBG_m(dbg_LOW, "Will start PM: " << iter->m_partName <<
00392                             " fsID" << iter->m_partFSID);
00393         // start Partition Manager (if not disabled)
00394         if (iter->m_partStatus != mps_Disabled) {
00395             StartPM(iter);
00396         }
00397     }
00398 }

Here is the call graph for this function:

Here is the caller graph for this function:

void mif_PartMgr::StopAllPart (  ) 

Definition at line 401 of file mif_partmgr.cpp.

References dbg_LOW, log_DBG_m, log_FUNC_m, m_partList, m_partList_x, mps_Online, and StopPM().

Referenced by i_ManagementInterface_i::Remove().

00401                               {
00402     log_FUNC_m(StopAllPart);
00403 
00404     cmn_MutexLock l(m_partList_x);
00405 
00406     vector<mif_PartEntry>::iterator iter;
00407     for (iter = m_partList.begin(); iter != m_partList.end(); ++iter){
00408         log_DBG_m(dbg_LOW, "Will stop PM: " << iter->m_partName);
00409         try {
00410             if (iter->m_partStatus == mps_Online) StopPM(iter);
00411         }
00412         catch (ivd_Exception &e) {
00413             log_DBG_m(dbg_LOW, "Cannot stop PM: " << iter->m_partName 
00414                                 << " - ignored: " << e);
00415         }
00416     }
00417 }

Here is the call graph for this function:

Here is the caller graph for this function:

void mif_PartMgr::GetClientFSIDs ( const string &  a_clientHost,
i_StringList_t a_list 
)

Definition at line 475 of file mif_partmgr.cpp.

References GetFSIDs(), log_FUNC_m, and m_partList_x.

Referenced by i_ManagementInterface_i::GetFSList().

00476                                                          {
00477     log_FUNC_m(GetClientFSIDs);
00478 
00479     cmn_MutexLock l(m_partList_x);
00480 
00481     GetFSIDs(a_clientHost, a_list);
00482 }

Here is the call graph for this function:

Here is the caller graph for this function:

bool mif_PartMgr::IsInRecallOnlyMode ( const string &  a_partName  ) 

Definition at line 484 of file mif_partmgr.cpp.

References Find(), ipc_EXEC_m, log_FUNC_m, and m_partList_x.

Referenced by i_ManagementInterface_i::UpdatePartition().

00484                                                              {
00485     log_FUNC_m(IsInRecallOnlyMode);
00486 
00487     cmn_MutexLock l(m_partList_x);
00488     vector<mif_PartEntry>::iterator iter = Find(a_partName);
00489   
00490     ipc_EXEC_m(
00491         return iter->m_iPM->RecallOnlyMode();
00492     );
00493 }

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

Definition at line 69 of file mif_partmgr.h.

Referenced by Find(), GetAllPartFromRM(), SetMif(), and StartPM().

Definition at line 71 of file mif_partmgr.h.


The documentation for this class was generated from the following files:

Generated on Mon Feb 27 19:43:29 2012 for OPENARCHIVE by  doxygen 1.5.6