Public Member Functions | Public Attributes | Private Member Functions | Private Attributes

i_MediumDupl_i Class Reference
[Management Interface]

#include <i_mediumdupl_impl.h>

Inheritance diagram for i_MediumDupl_i:
Inheritance graph
[legend]
Collaboration diagram for i_MediumDupl_i:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 i_MediumDupl_i (mif_JobManager &a_jobManager, string &a_sourceMedBC, string &a_targetMedBC, bool a_forced, i_UIMessageServer_ptr &a_UIMS_p)
virtual ~i_MediumDupl_i ()
void MediumOperationComplete (i_Index_t beaNumber, i_CompletionStatus_e a_status)
void CompleteJob (i_CompletionStatus_e status)
void AssignResources (const i_ResourceList_t &a_resources)
void GetNewResources (i_Index_t resourceNumber)
bool Process (UInt32_t a_beaNum)
void SetResourceBusyStatus (i_Index_t a_resNum, i_ResourceBusy_e a_resStatus)
i_JobRequestList_tGetFiles ()
i_FSC_ptr GetFSC ()

Public Attributes

 log_CLASSID_m

Private Member Functions

void CheckTargetMedium ()
void PreFormat ()
void Execute ()

Private Attributes

i_Medium_t_var m_sourceMedium
UInt64_t m_sourceMedSize
UInt64_t m_sourceDataSize
bool m_srcMediumFull
mif_VolStatus m_volStatus
i_Medium_t_var m_targetMedium
bool m_forced
bool m_sourceBeaRunning
bool m_targetBeaRunning
ui_MsgWriter m_ui
i_MediumVolSeq_t m_medVolInRmdb
bool m_duplSucceeded

Detailed Description

Definition at line 83 of file i_mediumdupl_impl.h.


Constructor & Destructor Documentation

i_MediumDupl_i::i_MediumDupl_i ( mif_JobManager a_jobManager,
string &  a_sourceMedBC,
string &  a_targetMedBC,
bool  a_forced,
i_UIMessageServer_ptr &  a_UIMS_p 
)

Definition at line 52 of file i_mediumdupl_impl.cpp.

References i_JobParams::bufType, dbg_DETAIL, dbg_LOW, dbg_NORM, ui_MsgWriter::DisplayMessage(), ivd_BaseException::GetError(), i_Job_i::GetResources(), ie_PRECONDITION, i_Job_i::InitBeaStatus(), ipc_EXEC_m, ivd_Error, i_JobParams::jobID, i_JobParams::jobType, log_DBG_m, log_FUNC_m, log_WriteEvent(), ipc_Log::LogJobParams(), ipc_Log::LogMediumVol(), ipc_Log::LogResources(), i_Job_i::m_activeBeas, i_Job_i::m_iJobParams, m_medVolInRmdb, i_Job_i::m_rm, m_sourceMedium, m_targetMedium, m_ui, m_volStatus, mt_DISK, pt_Backup, ipc_Init::ResourceInit(), rmdb_MEDIUM_OFFLINE, rmdb_MEDIUM_UNRELIABLE, rmdb_MEDIUM_UNUSABLE, mif_VolStatus::SetNumOfVol(), and i_Job_i::SetResources().

    :   i_Job_i(a_jobManager),
        m_sourceMedSize(0),
        m_sourceDataSize(0),
        m_srcMediumFull(false),
        m_forced(a_forced),
        m_sourceBeaRunning(false),
        m_targetBeaRunning(false),
        m_ui(a_UIMS_p)
{
    log_FUNC_m(i_MediumDupl_i);
    m_iJobParams.jobType        = jt_ADMIN;
    m_iJobParams.bufType        = i_DISK_BUF;

    ostringstream msg;
    msg << "Started.";

    log_WriteEvent(msg.str(), evt_ADMINJOB,
        m_iJobParams.jobID, a_sourceMedBC);
    m_ui.DisplayMessage(msg.str());

    log_DBG_m(dbg_NORM,"[" << m_iJobParams.jobID <<
        "] " << "ADMIN JOB: Started.");


    // select source medium info
    try {
        ipc_EXEC_m(
            m_sourceMedium = m_rm->SelectMedium(a_sourceMedBC.c_str());
            log_DBG_m(dbg_NORM, "Source medium: " << m_sourceMedium->barcode << "  selected.");
        );
    } catch (ivd_Exception) {
        throw ivd_Error(ie_PRECONDITION, "Source medium does not exist.", true);
    }

    if (m_sourceMedium->mediumType == mt_DISK){
        throw ivd_Error(ie_PRECONDITION, "Medium duplication of Disk Media is not allowed.", true);
    }

    if (m_sourceMedium->status & rmdb_MEDIUM_UNUSABLE) {
        throw ivd_Error(ie_PRECONDITION,
            "Medium " + string(m_sourceMedium->barcode) + " is marked unusable.", true);
    }

    if (m_sourceMedium->status & rmdb_MEDIUM_OFFLINE) {
        throw ivd_Error(ie_PRECONDITION,
            "Medium " + string(m_sourceMedium->barcode) + " is marked offline.", true);
    }

    ipc_EXEC_m(
        i_MediumVolSeq_t_var tmpMedVolInRmdb =
            m_rm->SelectAllMediumVolByBarcode(a_sourceMedBC.c_str());
        m_medVolInRmdb = tmpMedVolInRmdb;
        log_DBG_m(dbg_NORM, "Source medium contains: " << m_medVolInRmdb.length() << " volumes" );
        m_volStatus.SetNumOfVol(m_medVolInRmdb.length());
    );

    if ( m_medVolInRmdb.length() == 0){
        throw ivd_Error(ie_PRECONDITION, "Source medium not initialized.", true);
    }

    for (UInt32_t i(0); i < m_medVolInRmdb.length(); i++){
        log_DBG_m(dbg_DETAIL, "" << ipc_Log::LogMediumVol(m_medVolInRmdb[i]) );
    }

    // select media pool for source medium
    i_MediaPool_t_var mpool;
    try {
        ipc_EXEC_m(
            mpool = m_rm->SelectMediaPool(m_sourceMedium->mediaPoolName);
            log_DBG_m(dbg_NORM, "Pool: " << mpool->mediaPoolName << "  selected.");
        );
    } catch (ivd_Exception) {
        throw ivd_Error(ie_PRECONDITION, "Source medium not in pool.");
    }

    // check if the source media belongs to backup pool
    if (mpool->mediaPoolType == pt_Backup) {
        throw ivd_Error(ie_PRECONDITION, "Media duplication is not allowed for backup medium.", true);
    }

    //
    // Verify that the target medium doesn't belong to any pool,
    // which is assigned to a partition.
    //
    try {
        ipc_EXEC_m(
            m_targetMedium = m_rm->SelectMedium(a_targetMedBC.c_str());
            log_DBG_m(dbg_NORM, "Target medium: " << m_targetMedium->barcode << "  selected.");
        );
    } catch (ivd_Exception) {
        throw ivd_Error(ie_PRECONDITION, "Target medium does not exist.");
    }

    if (m_targetMedium->status & rmdb_MEDIUM_UNUSABLE) {
        throw ivd_Error(ie_PRECONDITION,
            "Medium " + string(m_targetMedium->barcode) + " is marked unusable.", true);
    }

    if (m_targetMedium->status & rmdb_MEDIUM_UNRELIABLE) {
        throw ivd_Error(ie_PRECONDITION,
            "Medium " + string(m_targetMedium->barcode) + " is marked unreliable.", true);
    }

    if (m_targetMedium->status & rmdb_MEDIUM_OFFLINE) {
        throw ivd_Error(ie_PRECONDITION,
            "Medium " + string(m_targetMedium->barcode) + " is marked offline.", true);
    }

    if (strlen(m_targetMedium->mediaPoolName) == 0) {
        log_DBG_m(dbg_NORM, "OK. Target medium does not belong to any pool.");
    }
    else {
        try {
            i_MediaPool_t_var tgtPool;
            ipc_EXEC_m(
                tgtPool = m_rm->SelectMediaPool(m_targetMedium->mediaPoolName);
            );
            if(strlen(tgtPool->partitionUUIDString) == 0) {
                log_DBG_m(dbg_NORM,
                    "OK. Pool \'" << m_targetMedium->mediaPoolName <<
                    "\' does not belong to any partition.");
            }
            else {
                i_Partition_t_var tgtPart;
                ipc_EXEC_m(
                    tgtPart = m_rm->SelectPartitionByUUID(tgtPool->partitionUUIDString);
                );
                ostringstream sstr;
                sstr
                    << "Target medium " << m_targetMedium->barcode
                    << " already belongs to partition \'" << tgtPart->partitionName
                    << "\'.";
                throw ivd_Error(ie_PRECONDITION, sstr.str());
            }
        } catch (ivd_Exception &e) {
            if (e.GetError() == ie_PRECONDITION)
                throw;

            ostringstream sstr;
            sstr
                << "Can't get RMDB record for pool \'"
                << m_targetMedium->mediaPoolName
                << "\'. Call support: possible database corruption.";
            throw ivd_Error(ie_PRECONDITION, sstr.str(), true);
        }
    }

    if( strlen( m_targetMedium->libraryName ) == 0 )
    {
        ostringstream sstr;
        sstr
            << "Target medium " << m_targetMedium->barcode
            << " is either a diskmedium or not located in a library.";
        throw ivd_Error(ie_PRECONDITION, sstr.str());
    }

    //
    // Check if some there are some volumes configured for target medium.
    //
    // Low probability, because the above check filters most of such cases out.
    // Overridable with --force
    //
    {
        i_MediumVolSeq_t_var targetVol;
        ipc_EXEC_m(
            targetVol = m_rm->SelectAllMediumVolByBarcode(a_targetMedBC.c_str());
        );
        if (targetVol->length() != 0 && !a_forced) {
            throw ivd_Error(ie_PRECONDITION,
                "Target medium already initialized. Use force option.", true);
        }
    }

    // OK, checks passed.

    i_ResourceList_t resources;
    resources.length(2);
    ipc_Init::ResourceInit(resources[0]);
    resources[0].resNum            = 0;
    resources[0].mediumKey         = m_sourceMedium->mediumKey;
    resources[0].barcode           = CORBA::string_dup(string(m_sourceMedium->barcode).c_str());
    resources[0].blockSize         = m_sourceMedium->blockSize;
    resources[0].poolKey           = mpool->mediaPoolKey;
    resources[0].poolType          = mpool->mediaPoolType;
    resources[0].mediumFamily      = mpool->mediaFamily;

    ipc_Init::ResourceInit(resources[1]);
    resources[1].resNum            = 1;
    resources[1].mediumKey         = m_targetMedium->mediumKey;
    resources[1].barcode           = CORBA::string_dup(string(m_targetMedium->barcode).c_str());
    resources[1].blockSize         = m_sourceMedium->blockSize;
    resources[1].poolKey           = 0;
    resources[1].medVolNr          = 0;
    resources[1].mediumFamily      = mpool->mediaFamily;

    SetResources(resources);
    m_activeBeas.resize(2);
    InitBeaStatus(2);
    log_DBG_m(dbg_LOW, "" << endl <<
        "Duplication Job Created:" << endl <<
        ipc_Log::LogJobParams(m_iJobParams) << endl <<
        ipc_Log::LogResources(GetResources()) << endl);
}

Here is the call graph for this function:

i_MediumDupl_i::~i_MediumDupl_i (  )  [virtual]

Definition at line 262 of file i_mediumdupl_impl.cpp.

References dbg_NORM, cmn_File::DeleteF(), cmn_Global::dirs, ivd_Directories::diskbuf, i_JobParams::diskBufferFS, g_cmn, cmn_FastDirLst::GetNextName(), ift_FILE, log_DBG_m, log_FUNC_m, i_Job_i::m_iJobParams, m_medVolInRmdb, and i_Job_i::ReleaseDiskBuffer().

                               {
    log_FUNC_m(~i_MediumDupl_i);
    // Delete all diskbuffer files.

    cmn_FastDirLst volFiles(g_cmn.dirs.diskbuf + m_iJobParams.diskBufferFS);

    string fileName;
    ivd_GenInode_t inode;
    ivd_FileType_e type;

    while ( !(fileName = volFiles.GetNextName(inode, type)).empty() ) {
        if ((fileName.compare(".") == 0) || (fileName.compare("..") == 0) ) {
            continue;
        }

        if (type == ift_FILE) {
            for (UInt32_t i(0); i < m_medVolInRmdb.length(); i++){
                if ( fileName.compare(  0,
                                        fileName.size()-2,
                                        m_medVolInRmdb[i].medVolId ) == 0 ){
                    try {
                        log_DBG_m(dbg_NORM, "Deleting file " << fileName);
                        cmn_File deleteMe(g_cmn.dirs.diskbuf + m_iJobParams.diskBufferFS + fileName);
                        deleteMe.DeleteF();
                    } catch (...) {
                        // ignore this error
                    }
                }
            }
        }
    }

    ReleaseDiskBuffer();
}

Here is the call graph for this function:


Member Function Documentation

void i_MediumDupl_i::AssignResources ( const i_ResourceList_t a_resources  )  [virtual]

Reimplemented from i_Job_i.

Definition at line 477 of file i_mediumdupl_impl.cpp.

References dbg_LOW, ui_MsgWriter::DisplayMessage(), i_Job_i::GetResources(), ipc_EXEC_m, i_JobParams::jobID, log_DBG_m, log_FUNC_m, log_WriteEvent(), ipc_Log::LogJobParams(), ipc_Log::LogResources(), i_Job_i::m_iJobParams, and m_ui.

                                                                       {
    log_FUNC_m(AssignResources);

    log_DBG_m(dbg_LOW,"Job: " << m_iJobParams.jobID <<
        "  got Resources:" << endl <<
        ipc_Log::LogResources(a_resources) );

    try {

        ostringstream msg;
        if (a_resources[0].resNum == 0){
            msg << "Source";
        }
        else {
            msg << "Target";
        }
        msg << " resources allocated.";

        ipc_EXEC_m(m_ui.DisplayMessage(msg.str()););
        log_WriteEvent(msg.str(), evt_ADMINJOB,
            m_iJobParams.jobID);

        i_Job_i::AssignResources(a_resources);

        log_DBG_m(dbg_LOW, "" << endl <<
            "Medium Duplicate Job:" << endl <<
            ipc_Log::LogJobParams(m_iJobParams) << endl <<
            ipc_Log::LogResources(GetResources()) << endl);

    } ipc_CATCH_IVD_THROW_CORBA_m;
} // AssignResources

Here is the call graph for this function:

void i_MediumDupl_i::CheckTargetMedium (  )  [private]

Definition at line 923 of file i_mediumdupl_impl.cpp.

References i_Job_i::ActivateBea(), bs_RUNNING, dbg_DETAIL, dbg_NORM, ui_MsgWriter::DisplayError(), ui_MsgWriter::DisplayMessage(), evt_ERROR, ivd_BaseException::GetFriendly(), i_Job_i::GetResources(), i_VOL_BLANK, i_VOL_ECMA, i_VOL_IVD, i_VOL_IVD_NT, i_VOL_OTHER, i_VOL_TAR, ie_MED_VOL_HDR_EXISTS, ie_MEDIUM_PARTITIONED, ie_PRECONDITION, ipc_EXEC_m, ivd_Error, ivd_MediaTypeToFamily(), job_MED_PROC, i_JobParams::jobID, i_Job_i::LoadUnload(), log_DBG_m, log_ERR_m, log_FUNC_m, log_WriteEvent(), ipc_Log::LogVolInfo(), i_Job_i::m_activate_c, i_Job_i::m_activate_x, i_Job_i::m_activeBeas, i_Job_i::m_beasStatus_x, m_forced, i_Job_i::m_iJob, i_Job_i::m_iJobParams, i_Job_i::m_rm, m_sourceMedium, i_Job_i::m_status, m_targetBeaRunning, m_targetMedium, m_ui, i_Job_i::NeedsProcess(), PreFormat(), i_Job_i::ReleaseResource(), i_Job_i::SetBeaStatus(), i_Job_i::SetResProcessed(), i_Job_i::SetResRequested(), i_Job_i::SetStatus(), and cmn_Condition::Wait().

Referenced by Execute().

                                      {
    log_FUNC_m(CheckTargetMedium);
    SetStatus(job_MED_PROC);
    {
        //request resources
        cmn_MutexLock l(m_activate_x);
        try {
            ipc_EXEC_m(
                i_ResourceList_t tmpRes;
                tmpRes.length(1);
                SetResRequested(1);
                tmpRes[0] = GetResources()[1];
                m_rm->GetResources(
                    m_iJob,
                    m_iJobParams,
                    tmpRes);
            );
        }
        catch (ivd_Exception){
            ostringstream msg;
            msg << "[" << m_iJobParams.jobID <<
                    "] " << "GetResources failed.";
            log_WriteEvent(msg.str(), evt_ADMINJOB,
                m_iJobParams.jobID);
            m_ui.DisplayMessage(msg.str());
            log_ERR_m(msg.str());
            m_status = i_RESOURCE_ERROR;
            throw;
        }
        //wait for rm to call back with resources
        m_activate_c.Wait();
    }
    if (!NeedsProcess(1)){
        log_ERR_m("Job started with check but resources not assigned.");
    }

    //prepare medium
    LoadUnload(1);

    ostringstream msg2;
    msg2 << "Starting Back End Agent for medium: ";
    msg2 << m_targetMedium->barcode;

    ipc_EXEC_m(m_ui.DisplayMessage(msg2.str()););

    log_WriteEvent(msg2.str(), evt_ADMINJOB,
        m_iJobParams.jobID);

    {
        cmn_MutexLock l(m_beasStatus_x);
        ActivateBea(1);
        SetBeaStatus(1, bs_RUNNING);
    }
    m_targetBeaRunning = true;

    //check if there are volumes
    i_VolSizes_t_var volumeSizes;
    ipc_EXEC_m(
        volumeSizes   = m_activeBeas[1]->GetVolumeSizes();
    );
    ostringstream msg;
    if (volumeSizes->length() > 1){
        log_DBG_m(dbg_NORM, "Several volumes detected on target medium:" <<
                            volumeSizes->length() );
        if (m_forced){
            log_DBG_m(dbg_NORM, "Forced mode starting Format");
                PreFormat();
        }
        else {
            msg << "Target medium already formated. Duplication not allowed." <<
                " Use --force option to override.";

            ipc_EXEC_m(m_ui.DisplayMessage(msg.str()););
            log_WriteEvent(evt_ERROR, msg.str(), evt_DUPLJOB,
                m_iJobParams.jobID, string(m_targetMedium->barcode));
            throw ivd_Error(ie_MEDIUM_PARTITIONED, msg.str());
        }
    } // if (volumeSizes->length() > 1

    i_VolInfo_t_var volInfo;
    try {
        ipc_EXEC_m(
            volInfo = m_activeBeas[1]->GetVolInfo(1);
        );
        log_DBG_m(dbg_DETAIL, "[" << m_iJobParams.jobID <<
                                "] " << "Found volume" <<
                                endl << ipc_Log::LogVolInfo(volInfo));

        if (ivd_MediaTypeToFamily(static_cast<ivd_MediaType_e>(volInfo->mediumType)) !=
            ivd_MediaTypeToFamily(static_cast<ivd_MediaType_e>(m_sourceMedium->mediumType))){
            throw ivd_Error(ie_PRECONDITION,
                "Source and target medium are not of same Media Family.");
        }



        switch (volInfo->type) {
            case i_VOL_BLANK:
                ipc_EXEC_m(m_ui.DisplayMessage("Blank target medium detected."););
                PreFormat();
                // OK
                break;
            case i_VOL_IVD:
                throw ivd_Error(ie_MED_VOL_HDR_EXISTS);
                break;
            case i_VOL_ECMA:
                throw ivd_Error(ie_MED_VOL_HDR_EXISTS);
                break;
            case i_VOL_TAR:
                throw ivd_Error(ie_MED_VOL_HDR_EXISTS);
                break;
            case i_VOL_IVD_NT:
                throw ivd_Error(ie_MED_VOL_HDR_EXISTS);
                break;
            case i_VOL_OTHER:
                // OK
                PreFormat();
                break;
        }

        ReleaseResource(1);
        SetResProcessed(1);
    } catch (ivd_Exception &e){
        log_ERR_m("[" << m_iJobParams.jobID <<
            "] " << "Get volume info failed:" << endl << e);
        msg << "Failed retrieving volume info (" << e.GetFriendly() << ").";
        log_WriteEvent(evt_ERROR, msg.str(), evt_DUPLJOB,
            m_iJobParams.jobID, string(m_targetMedium->barcode));
        ipc_EXEC_m(m_ui.DisplayError(msg.str()););
        throw;
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void i_MediumDupl_i::CompleteJob ( i_CompletionStatus_e  status  )  [virtual]

Implements i_Job_i.

Definition at line 451 of file i_mediumdupl_impl.cpp.

References ui_MsgWriter::DisplayMessage(), i_Job_i::GetResources(), i_SUCCEDED, ipc_CATCH_IVD_THROW_CORBA_m, ipc_EXEC_m, i_JobParams::jobID, log_FUNC_m, log_WriteEvent(), i_Job_i::m_iJobParams, m_ui, i_Resource_t::medVolNr, i_Job_i::Remove(), and i_Job_i::SetResources().

Referenced by MediumOperationComplete().

                                                             {
    log_FUNC_m(CompleteJob);
    try {
        ostringstream msg;
        msg << "[" << m_iJobParams.jobID <<
            "] ";

        if (a_status == i_SUCCEDED)
            msg << "Finished.";
        else
            msg << "Failed.";

        log_WriteEvent(msg.str(), evt_ADMINJOB,
            m_iJobParams.jobID);
        m_ui.DisplayMessage(msg.str());

        // bug 1511 Set currentVolume of target resource to 0
        i_Resource_t tmpRes = GetResources()[1];
        tmpRes.medVolNr = 0;
        SetResources(tmpRes);

        ipc_EXEC_m(Remove());
    }
    ipc_CATCH_IVD_THROW_CORBA_m
}

Here is the call graph for this function:

Here is the caller graph for this function:

void i_MediumDupl_i::Execute (  )  [private, virtual]

Second step RM-> ask for source resources

Implements i_Job_i.

Definition at line 770 of file i_mediumdupl_impl.cpp.

References CheckTargetMedium(), dbg_DETAIL, dbg_NORM, ui_MsgWriter::DisplayMessage(), evt_WARNING, mif_VolStatus::GetCurrentTargetVol(), i_Job_i::GetResources(), ipc_EXEC_m, i_Job_i::IsAborted(), i_Job_i::IsFinished(), job_MED_PROC, i_JobParams::jobID, log_DBG_m, log_ERR_m, log_FUNC_m, log_WriteEvent(), i_Job_i::m_activate_x, m_forced, i_Job_i::m_iJob, i_Job_i::m_iJobParams, m_medVolInRmdb, i_Job_i::m_rm, m_sourceDataSize, m_sourceMedium, m_srcMediumFull, i_Job_i::m_status, m_targetMedium, m_ui, m_volStatus, MIF_DATA_COMPRESSION_FACTOR, i_Job_i::NeedsProcess(), Process(), i_Job_i::RequestDiskBuffer(), rmdb_MEDIUM_FULL, i_Job_i::SetResProcessed(), i_Job_i::SetResRequested(), i_Job_i::SetStatus(), mif_VolStatus::SourceVolRead(), and i_Job_i::WaitBeasToFinish().

                            {
    log_FUNC_m(Execute);

    if (!m_forced) {
        CheckTargetMedium();
    }
    try {
        // calculate needed space
        for (UInt32_t i(0); i < m_medVolInRmdb.length(); i++){
            m_sourceDataSize += (m_medVolInRmdb[i].volSize * m_medVolInRmdb[i].volUsed)/100;
            log_DBG_m(dbg_NORM, "[" << m_iJobParams.jobID <<
                "] " << "SourceVolSize:" << m_medVolInRmdb[i].volSize <<
                "  Sum: " << m_sourceDataSize);
        }

        m_sourceDataSize *=  cfg_MEGABYTE;

        UInt64_t dataSize(UInt64_t(m_sourceDataSize * MIF_DATA_COMPRESSION_FACTOR));
        UInt64_t allocated(0);

        string mif("mif");
        UInt64_t maxDiskBuff = m_rm->GetMaxDiskBufferSize(mif.c_str());

        RequestDiskBuffer(dataSize, dataSize, allocated, maxDiskBuff);
    }
    catch (ivd_Exception){
        ostringstream msg;
        msg <<  " ReserveDiskBuffer failed.";
        log_WriteEvent(msg.str(), evt_ADMINJOB,
            m_iJobParams.jobID);

        m_ui.DisplayMessage(msg.str());
        log_ERR_m(msg.str());

        m_status = i_RESOURCE_ERROR;
        throw;
    }

    SetStatus(job_MED_PROC);
    try {
        ipc_EXEC_m(
            i_ResourceList_t tmpRes;
            tmpRes.length(1);
            SetResRequested(0);
            tmpRes[0] = GetResources()[0];
            m_rm->GetResources(
                m_iJob,
                m_iJobParams,
                tmpRes);
        );
    }
    catch (ivd_Exception){
        ostringstream msg;
        msg << "[" << m_iJobParams.jobID <<
                "] " << "GetResources failed.";
        log_WriteEvent(msg.str(), evt_ADMINJOB,
            m_iJobParams.jobID);
        m_ui.DisplayMessage(msg.str());
        log_ERR_m(msg.str());
        m_status = i_RESOURCE_ERROR;
        throw;
    }

    // if sys volume of source medium is closed/full then the copy of the medium does
    // not need to have sys volume of size equal to source sys volume, but just the size
    // that is actually taken by FRI.
    try {
        i_Medium_t_var rmMedium = m_rm->SelectMedium(CORBA::string_dup(m_sourceMedium->barcode));

        if ((rmMedium->status & rmdb_MEDIUM_FULL) == rmdb_MEDIUM_FULL) {
            m_srcMediumFull = true;
            log_DBG_m(dbg_NORM, "Medium is full.");
        }
    } catch(...) {
        // Ignore all exceptions at this point.
        ostringstream sstr;
        sstr << "Cannot get medium status from RM";

        log_WriteEvent(evt_WARNING, sstr.str(), "",
            m_iJobParams.jobID, string(m_targetMedium->barcode));
    }

    try {
        while ( !IsFinished() && !IsAborted() ) {

            for (UInt32_t i(0); i < GetResources().length(); i++){
                log_DBG_m(dbg_DETAIL,
                    "[" << m_iJobParams.jobID <<
                    "] " <<"Processing copyNum:" << i <<
                    " resources assigned:" <<
                    GetResources()[i].resAssigned <<
                    " copy processed:" <<
                    GetResources()[i].resProcessed);

                if ( NeedsProcess(i) ) {
                    if (Process(i)){
                        SetResProcessed(i);
                    }
                }
            }
            if (IsAborted()){
                return;
            }


            cmn_MutexLock l(m_activate_x);

            if (!NeedsProcess(0) ||
                (!NeedsProcess(1) && !m_volStatus.SourceVolRead(m_volStatus.GetCurrentTargetVol())) ){
                    // target medium need process but will still wait because source needs to finish first
                    WaitBeasToFinish(5);
            }

        }
    }
    catch (ivd_Exception){
        m_status = i_FAILED;
        throw;
    }

}

Here is the call graph for this function:

i_JobRequestList_t * i_MediumDupl_i::GetFiles ( void   )  [virtual]
i_FSC_ptr i_MediumDupl_i::GetFSC ( void   )  [virtual]

Implements i_Job_i.

Definition at line 527 of file i_mediumdupl_impl.cpp.

References ie_IMPOSSIBLE, ipc_CATCH_IVD_THROW_CORBA_m, ivd_Error, and log_FUNC_m.

                                {
    log_FUNC_m(GetFSC);
    try {
        i_FSC_ptr dummy;
        throw ivd_Error(ie_IMPOSSIBLE);
        return dummy;
    }
    ipc_CATCH_IVD_THROW_CORBA_m
}

void i_MediumDupl_i::GetNewResources ( i_Index_t  resourceNumber  )  [virtual]

Implements i_Job_i.

Definition at line 509 of file i_mediumdupl_impl.cpp.

References ie_IMPOSSIBLE, ipc_CATCH_IVD_THROW_CORBA_m, ivd_Error, and log_FUNC_m.

                                                            {
    log_FUNC_m(GetNewResources);
    // Not Implemented for MediumDupl
    try {
        throw ivd_Error(ie_IMPOSSIBLE);
    }
    ipc_CATCH_IVD_THROW_CORBA_m
}

void i_MediumDupl_i::MediumOperationComplete ( i_Index_t  beaNumber,
i_CompletionStatus_e  a_status 
) [virtual]

Implements i_Job_i.

Definition at line 298 of file i_mediumdupl_impl.cpp.

References mif_VolStatus::AllSuccess(), cmn_Condition::Broadcast(), bs_NOT_RUNNING, bs_RUNNING, CompleteJob(), dbg_LOW, dbg_NORM, ui_MsgWriter::DisplayMessage(), i_Job_i::Finished(), mif_VolStatus::GetCurrentSourceVol(), mif_VolStatus::GetCurrentTargetVol(), i_Job_i::GetResources(), i_SUCCEDED, ipc_EXEC_m, i_Job_i::IsAborted(), job_POST_MED_PROC, i_JobParams::jobID, log_DBG_m, log_ERR_m, log_FUNC_m, log_WriteEvent(), i_Job_i::m_activate_c, i_Job_i::m_activate_x, i_Job_i::m_activeBeas, i_Job_i::m_beasStatus_x, i_Job_i::m_iJob, i_Job_i::m_iJobParams, m_medVolInRmdb, i_Job_i::m_rm, m_sourceMedium, i_Job_i::m_status, m_targetMedium, m_ui, m_volStatus, i_Resource_t::medVolNr, i_Job_i::ReleaseResource(), i_Job_i::Remove(), i_Resource_t::resProcessed, i_Job_i::SetBeaStatus(), i_Job_i::SetResMedOpComplete(), i_Job_i::SetResources(), i_Job_i::SetResProcessed(), i_Job_i::SetResRequested(), i_Job_i::SetStatus(), mif_VolStatus::SourceFinished(), mif_VolStatus::SourceVolRead(), mif_VolStatus::TargetFinished(), and mif_VolStatus::TargetVolWrite().

{
    log_FUNC_m(MediumOperationComplete);
    log_DBG_m(dbg_NORM, "a_beaNumber" << a_beaNumber);

    if (IsAborted()){
        return;
    }

    {
        cmn_MutexLock l(m_beasStatus_x);
        SetBeaStatus(a_beaNumber, bs_RUNNING);
    }

    if (a_beaNumber == 0){ // Source Bea
        UInt32_t currVol = m_volStatus.GetCurrentSourceVol();

        if (a_status == i_SUCCEDED) {
            ostringstream msg;
            msg << "Medium " << m_sourceMedium->barcode << ", "
                << "volume " << currVol << ": Volume read and written to disk buffer.";

            ipc_EXEC_m(m_ui.DisplayMessage(msg.str()););
            log_WriteEvent(msg.str(), evt_ADMINJOB,
                m_iJobParams.jobID, string(m_sourceMedium->barcode));

            msg << m_medVolInRmdb[currVol - 1].medVolId << ".";
            log_DBG_m(dbg_NORM, msg.str());

            m_volStatus.SourceVolRead(true);
            // if this is first source volume call GetResources for target volume
            if ((currVol == 1) &&
                !(GetResources()[1].resRequested)) {
                    ipc_EXEC_m (
                        SetResRequested(1);
                        i_ResourceList_t tmpRes;
                        tmpRes.length(1);
                        tmpRes[0] = GetResources()[1];

                        m_rm->GetResources( m_iJob,
                                            m_iJobParams,
                                            tmpRes);
                    );
                }
        } else { // NOT success
            m_volStatus.SourceVolRead(false);
            ostringstream msg;
            msg << "Could not read medium volume: "
                << m_medVolInRmdb[currVol - 1].medVolId << ".";

            ipc_EXEC_m(m_ui.DisplayMessage(msg.str());)
            log_WriteEvent(msg.str(), evt_ADMINJOB,
                m_iJobParams.jobID, string(m_sourceMedium->barcode));
            log_ERR_m(msg.str());
        }
        if (m_volStatus.SourceFinished()){
            SetResMedOpComplete(a_beaNumber);
            // release resource
            log_DBG_m(dbg_NORM, "ReleaseResource(a_beaNumber):" << a_beaNumber);

            ostringstream msg;
            msg << "Releasing source medium resources.";

            ipc_EXEC_m(m_ui.DisplayMessage(msg.str()););
            log_WriteEvent(msg.str(), evt_ADMINJOB,
                m_iJobParams.jobID, string(m_sourceMedium->barcode));

            ReleaseResource(a_beaNumber);
            SetResProcessed(a_beaNumber);
            cmn_MutexLock l(m_beasStatus_x);
            ipc_EXEC_m(m_activeBeas[a_beaNumber]->Remove(););
            SetBeaStatus(a_beaNumber, bs_NOT_RUNNING);
        } else {
            i_Resource_t tmpRes;
            tmpRes = GetResources()[a_beaNumber];
            tmpRes.resProcessed = false;
            SetResources(tmpRes);
        }
        cmn_MutexLock l(m_activate_x);
        m_activate_c.Broadcast();
    }

    if (a_beaNumber == 1){ // Target Bea

        UInt32_t currVol = m_volStatus.GetCurrentTargetVol();
        if (a_status == i_SUCCEDED) {
            ostringstream msg;
            msg << "Medium " << m_targetMedium->barcode << ", "
                << "volume " << currVol << ": Volume read and written to medium.";

            ipc_EXEC_m(m_ui.DisplayMessage(msg.str()););
            log_WriteEvent(msg.str(), evt_ADMINJOB,
                m_iJobParams.jobID, string(m_targetMedium->barcode));

            msg << m_medVolInRmdb[currVol - 1].medVolId << ".";
            log_DBG_m(dbg_NORM, msg.str());

            m_volStatus.TargetVolWrite(true);
        } else { // NOT success
            ostringstream msg;
            msg << "Could not write medium volume: "
                << m_medVolInRmdb[currVol - 1].medVolId << ".";

            ipc_EXEC_m(m_ui.DisplayMessage(msg.str()););
            log_WriteEvent(msg.str(), evt_ADMINJOB,
                m_iJobParams.jobID, string(m_targetMedium->barcode));
            log_ERR_m(msg.str());

            m_volStatus.TargetVolWrite(false);
            Finished();
            m_status = i_FAILED;
        }
        if (m_volStatus.TargetFinished()){
            SetResMedOpComplete(a_beaNumber);
            // release resource
            i_Resource_t tmpRes = GetResources()[1];
            tmpRes.medVolNr = 0;
            tmpRes.resProcessed = true;
            SetResources(tmpRes);

            ostringstream msg;
            msg << "Releasing target medium resources.";

            ipc_EXEC_m(m_ui.DisplayMessage(msg.str()););
            log_WriteEvent(msg.str(), evt_ADMINJOB,
                m_iJobParams.jobID, string(m_targetMedium->barcode));

            ReleaseResource(a_beaNumber);
            SetStatus(job_POST_MED_PROC);
        } else {
            i_Resource_t tmpRes;
            tmpRes = GetResources()[a_beaNumber];
            tmpRes.resProcessed = false;
            SetResources(tmpRes);
        }
        cmn_MutexLock l(m_activate_x);
        m_activate_c.Broadcast();
    }

    if (m_volStatus.SourceFinished() &&
        m_volStatus.TargetFinished()){
        log_DBG_m(dbg_LOW, "job finished");
        if (m_volStatus.AllSuccess()){
            m_status = i_SUCCEDED;
            CompleteJob(i_SUCCEDED);
        }
    }
}

Here is the call graph for this function:

void i_MediumDupl_i::PreFormat (  )  [private]

Definition at line 746 of file i_mediumdupl_impl.cpp.

References dbg_LOW, ui_MsgWriter::DisplayMessage(), ipc_EXEC_m, i_JobParams::jobID, log_DBG_m, log_FUNC_m, log_WriteEvent(), i_Job_i::m_activeBeas, i_Job_i::m_iJobParams, i_Job_i::m_rm, m_sourceMedium, m_targetMedium, m_ui, i_MediaPool_t::mediaFamily, and mf_AIT.

Referenced by CheckTargetMedium(), and Process().

                              {
    log_FUNC_m(PreFormat);
    i_VolSizes_t volSizes;
    //if source medium is AIT and has more than 1 volume, format target medium in AIT mode
    bool duplAITMode(false);
    i_MediaPool_t* rmPool = m_rm->SelectMediaPool(m_sourceMedium->mediaPoolName);
    if (rmPool->mediaFamily == mf_AIT && m_sourceMedium->numOfVolumes > 1){
        duplAITMode = true;
    }
    volSizes.length(1);
    volSizes[0] = 1;
    ostringstream msg1;
    msg1 << "Medium " << m_targetMedium->barcode << ": Formating Medium " <<
            m_targetMedium->barcode << ".";
    log_DBG_m(dbg_LOW, "[" << m_iJobParams.jobID <<
                        "] " << msg1 );
    ipc_EXEC_m(m_ui.DisplayMessage(msg1.str()););
    log_WriteEvent(msg1.str(), evt_ADMINJOB,
        m_iJobParams.jobID, string(m_targetMedium->barcode));

    m_activeBeas[1]->Format(volSizes, duplAITMode);
}

Here is the call graph for this function:

Here is the caller graph for this function:

bool i_MediumDupl_i::Process ( UInt32_t  a_beaNum  ) 

Definition at line 538 of file i_mediumdupl_impl.cpp.

References i_Job_i::ActivateBea(), bs_PROCESSING, bs_RUNNING, dbg_LOW, dbg_NORM, ui_MsgWriter::DisplayError(), ui_MsgWriter::DisplayMessage(), evt_ADMINJOB, evt_ERROR, mif_VolStatus::GetCurrentSourceVol(), mif_VolStatus::GetCurrentTargetVol(), i_Job_i::GetJobTypeText(), mif_VolStatus::GetNumOfVol(), i_Job_i::GetResources(), ie_IMPOSSIBLE, ie_JOB_FAILED, ie_PRECONDITION, ipc_EXEC_m, i_Job_i::IsAborted(), ivd_Error, i_JobParams::jobID, i_Job_i::LoadUnload(), log_DBG_m, log_ERR_m, log_FUNC_m, log_WriteEvent(), log_WRN_m, i_Job_i::m_activeBeas, i_Job_i::m_beasStatus_x, i_Job_i::m_iJobParams, m_medVolInRmdb, m_sourceBeaRunning, m_sourceMedium, m_sourceMedSize, m_srcMediumFull, m_targetBeaRunning, m_targetMedium, m_ui, m_volStatus, i_Resource_t::medVolId, i_Resource_t::medVolNr, i_Resource_t::medVolType, PreFormat(), rmdb_SYSTEM_VOLUME, i_Job_i::SetBeaStatus(), i_Job_i::SetResources(), i_Job_i::SetResProcessed(), and mif_VolStatus::SourceVolRead().

Referenced by Execute().

                                             {
    log_FUNC_m(Process);

    if (a_beaNum == 0 ){
        UInt32_t volNum = m_volStatus.GetCurrentSourceVol();
        log_DBG_m(dbg_NORM, "Processing SourceVolume: " << volNum);

        i_Resource_t tmpRes = GetResources()[a_beaNum];
        tmpRes.medVolId = m_medVolInRmdb[volNum - 1].medVolId;

        log_DBG_m(dbg_NORM, "SourceVolume medVolID: " << tmpRes.medVolId);
        tmpRes.medVolNr = m_medVolInRmdb[volNum - 1].medVolNr;

        SetResources(tmpRes);

        // if ( !m_sourceBeaRunning ){
            LoadUnload(a_beaNum);
            ostringstream msg2;
            msg2 << "Starting Back End Agent for medium: ";
            msg2 << m_sourceMedium->barcode;

            ipc_EXEC_m(m_ui.DisplayMessage(msg2.str()););

            log_WriteEvent(msg2.str(), evt_ADMINJOB,
                m_iJobParams.jobID);

            {
                cmn_MutexLock l(m_beasStatus_x);
                ActivateBea(a_beaNum);
                SetBeaStatus(a_beaNum, bs_RUNNING);
            }
            m_sourceBeaRunning = true;
        // }


        ostringstream msg;
        msg << "Medium " << m_sourceMedium->barcode << ", "
            << "volume " << volNum << ": Reading volume identification...";

        ipc_EXEC_m(m_ui.DisplayMessage(msg.str()););
        log_WriteEvent(msg.str(), evt_ADMINJOB,
                        m_iJobParams.jobID, string(m_sourceMedium->barcode));

        ipc_EXEC_m(m_sourceMedSize = m_activeBeas[a_beaNum]->GetMediumSize(););

        if (volNum == 1) {
            ipc_EXEC_m(
                i_VolSizes_t_var volumeSizes =
                    m_activeBeas[a_beaNum]->GetVolumeSizes();
                log_DBG_m(dbg_NORM, "Volumes on source medium:" << volumeSizes->length());
                if (volumeSizes->length() != m_volStatus.GetNumOfVol()){
                    ostringstream os;
                    os << "Source medium contains empty or non-HSM volumes.";
                    log_WriteEvent(evt_ERROR, os.str(),
                        GetJobTypeText(), m_iJobParams.jobID);

                    log_ERR_m(  "[" << m_iJobParams.jobID << "] " << os.str());
                    ipc_EXEC_m(m_ui.DisplayMessage(os.str()););
                    throw ivd_Error(ie_JOB_FAILED, os.str());
                }
            );
        }

        ostringstream msg1;
        msg1 << "Medium " << m_sourceMedium->barcode << ", "
             << "volume " << volNum << ": Reading data.";

        ipc_EXEC_m(m_ui.DisplayMessage(msg1.str()););
        log_WriteEvent(msg1.str(), evt_ADMINJOB,
            m_iJobParams.jobID, string(m_sourceMedium->barcode));


        if ( (m_medVolInRmdb[volNum - 1].volType != rmdb_SYSTEM_VOLUME) &&
             ((m_medVolInRmdb[volNum - 1].status & rmdb_MEDVOL_FULL) == 0) )
        {
            // VolDupWrite for open volume
            ostringstream msgO;
            msgO << "Duplication of open Volume. Barcode:" <<
                m_sourceMedium->barcode <<
                " volNum: " << volNum;
            log_WriteEvent(msgO.str(), evt_ADMINJOB, m_iJobParams.jobID);
            log_WRN_m(msgO.str());
            ipc_EXEC_m(m_ui.DisplayMessage(msgO.str()););
        }
        SetResProcessed(0);
        // read volume
        ipc_EXEC_m(
            cmn_MutexLock l(m_beasStatus_x);
            m_activeBeas[a_beaNum]->VolDupRead();
            SetBeaStatus(a_beaNum, bs_PROCESSING);
        );
    }
    else if (a_beaNum == 1) {
        UInt32_t volNum = m_volStatus.GetCurrentTargetVol();
        log_DBG_m(dbg_NORM, "Processing TargetVolume: " << volNum);
        if (!m_volStatus.SourceVolRead(volNum)) {
            log_DBG_m(dbg_NORM, "Volume: " << volNum << " Not yet ready for processing");
            return false;
        }

        i_Resource_t tmpRes = GetResources()[1];
        tmpRes.medVolId = m_medVolInRmdb[volNum - 1 ].medVolId;
        tmpRes.medVolNr = m_medVolInRmdb[volNum - 1 ].medVolNr;
        tmpRes.medVolType = m_medVolInRmdb[volNum - 1 ].volType;
        SetResources(tmpRes);

        // if ( !m_targetBeaRunning ){
            LoadUnload(a_beaNum);
            ostringstream msg2;
            msg2 << "Starting Back End Agent for medium: ";
            msg2 << m_targetMedium->barcode;

            ipc_EXEC_m(m_ui.DisplayMessage(msg2.str()););

            log_WriteEvent(msg2.str(), evt_ADMINJOB,
                m_iJobParams.jobID);

            {
                cmn_MutexLock l(m_beasStatus_x);
                ActivateBea(a_beaNum);
                SetBeaStatus(a_beaNum, bs_RUNNING);
            }
            m_targetBeaRunning = true;
            SetResProcessed(1);
        // }

        if (volNum == 1) {
            // Get Volume Sizes

            ostringstream msg2;
            msg2 << "Checking medium format.";

            ipc_EXEC_m(m_ui.DisplayMessage(msg2.str()););
            log_WriteEvent(msg2.str(), evt_ADMINJOB,
                m_iJobParams.jobID, string(m_targetMedium->barcode));


            UInt32_t targetMedSize;
            ipc_EXEC_m(
                targetMedSize = m_activeBeas[a_beaNum]->GetMediumSize();
            );

            log_DBG_m(dbg_LOW, "m_sourceMedSize=" << m_sourceMedSize <<
                               ", targetMedSize=" << targetMedSize);

            if (targetMedSize < m_sourceMedSize){
                ostringstream msg3;
                msg3 << "Target medium is of smaller size than source medium.";

                ipc_EXEC_m(m_ui.DisplayError(msg3.str()););
                log_WriteEvent(msg3.str(), evt_ADMINJOB,
                                m_iJobParams.jobID, string(m_targetMedium->barcode));

                throw ivd_Error(ie_PRECONDITION, msg3.str());
            }

            ostringstream msg;
            msg << "Medium " << m_sourceMedium->barcode
                << ": Will format medium ...";
            ipc_EXEC_m(
                m_ui.DisplayMessage(msg.str());
            );
            log_WriteEvent("Will format medium ...", evt_ADMINJOB,
                m_iJobParams.jobID, string(m_targetMedium->barcode));
            PreFormat();

            if (IsAborted()) return false;

        }// if (volNum == 1)

        bool appendVolume(true);
        log_DBG_m(dbg_NORM, "[" << m_iJobParams.jobID <<
                            "] " <<"volNum:" << volNum <<
                            " m_medVolInRmdb.length():" << m_medVolInRmdb.length());
        if (volNum == m_medVolInRmdb.length() ) {// is it the last volume?
            appendVolume = false;
        }

        ostringstream msg;
        msg << "Medium " << m_targetMedium->barcode;
        msg << ", " << "volume " << volNum << ": Writing Data...";

        ipc_EXEC_m(m_ui.DisplayMessage(msg.str()););
        log_WriteEvent(msg.str(), evt_ADMINJOB,
                        m_iJobParams.jobID, string(m_targetMedium->barcode));

        log_DBG_m(dbg_LOW, "[" << m_iJobParams.jobID <<
                            "] " << "Calling VolDupWrite appendVolume:" <<
                           boolalpha << appendVolume <<
                           " Size:" << m_medVolInRmdb[volNum - 1].volSize);

        ipc_EXEC_m(
            cmn_MutexLock l(m_beasStatus_x);
            m_activeBeas[a_beaNum]->VolDupWrite(
                                        m_medVolInRmdb[volNum - 1].volSize,
                                        appendVolume,
                                        m_srcMediumFull
                                    );
            SetBeaStatus(a_beaNum, bs_PROCESSING);
        );
    } else { // bea number is not 0 and not 1
        throw ivd_Error(ie_IMPOSSIBLE);
    };
    return true;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void i_MediumDupl_i::SetResourceBusyStatus ( i_Index_t  a_resNum,
i_ResourceBusy_e  a_resStatus 
)

Reimplemented from i_Job_i.

Definition at line 893 of file i_mediumdupl_impl.cpp.

References i_Resource_t::barcode, evt_INFO, i_Job_i::GetResources(), i_MEDIUM_BUSY, i_MEDIUM_NOT_AVAILABLE, log_FUNC_m, log_WriteEvent(), ipc_Log::ResourceBusy(), i_Resource_t::resourceBusyStatus, and i_Job_i::SetResources().

                                                                              {
    log_FUNC_m(SetResourceBusyStatus);

    try {
        i_Resource_t tmpRes;
        tmpRes = GetResources()[a_resNum];
        tmpRes.resourceBusyStatus = a_resStatus;
        SetResources(tmpRes);

        ostringstream msg;

        msg << ipc_Log::ResourceBusy(a_resStatus);

        if (a_resStatus == i_MEDIUM_BUSY ||
            a_resStatus == i_MEDIUM_NOT_AVAILABLE){

            msg << " <";
            //waiting for medium <bc: 000123>
            msg << "bc: " <<
            tmpRes.barcode << ">";
        }

        log_WriteEvent(evt_INFO, msg.str());
        // Workaround for bug 8652 GUI deadlock
        // m_ui.DisplayMessage(msg.str());

    } ipc_CATCH_IVD_THROW_CORBA_m;
}

Here is the call graph for this function:


Member Data Documentation

Reimplemented from i_Job_i.

Definition at line 85 of file i_mediumdupl_impl.h.

Definition at line 131 of file i_mediumdupl_impl.h.

bool i_MediumDupl_i::m_forced [private]

Definition at line 124 of file i_mediumdupl_impl.h.

Referenced by CheckTargetMedium(), and Execute().

Definition at line 125 of file i_mediumdupl_impl.h.

Referenced by Process().

Definition at line 118 of file i_mediumdupl_impl.h.

Referenced by Execute().

i_Medium_t_var i_MediumDupl_i::m_sourceMedium [private]

Definition at line 117 of file i_mediumdupl_impl.h.

Referenced by Process().

Definition at line 119 of file i_mediumdupl_impl.h.

Referenced by Execute(), and Process().

Definition at line 126 of file i_mediumdupl_impl.h.

Referenced by CheckTargetMedium(), and Process().

i_Medium_t_var i_MediumDupl_i::m_targetMedium [private]

Definition at line 120 of file i_mediumdupl_impl.h.

Referenced by Execute(), i_MediumDupl_i(), MediumOperationComplete(), and Process().


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