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

i_LibraryAgentSCSI_i Class Reference
[IVD Library Agent]

#include <i_la-s_impl.h>

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

List of all members.

Public Member Functions

 i_LibraryAgentSCSI_i (string a_libName)
void Inventory (CORBA::Boolean a_force)
void Load (const char *a_slot, const char *a_drive, const char *a_barcode, i_JobID_t a_jobID)
void Unload (const char *a_drive, const char *a_slot, const char *a_barcode, i_JobID_t a_jobID)
void ConfirmMountRequest (const char *a_drive, CORBA::Boolean a_ok)
void Reconfigure (const i_Library_t &a_libCfg)
void Remove ()

Private Member Functions

virtual ~i_LibraryAgentSCSI_i ()
vector< la_SCSILibrary::DriveInfoReadDriveInfo ()
void UpdateIDs (i_Library_t a_lib)

Private Attributes

 log_CLASSID_m
la_SCSILibrary m_scsiLib
string m_libName
cmn_Mutex m_lib_x
cmn_Mutex m_serialUnload_x
bool m_serialUnload
bool m_active
i_ResourceManager_var m_iRM

Friends

class la_SCSILibrary

Detailed Description

Definition at line 44 of file i_la-s_impl.h.


Constructor & Destructor Documentation

i_LibraryAgentSCSI_i::i_LibraryAgentSCSI_i ( string  a_libName  ) 

Definition at line 72 of file i_la-s_impl.cpp.

References cmn_GetEnvVariable(), cmn_StrUpperCase(), dbg_LOW, evt_ERROR, ipc_EXEC_m, la_serialUnload_c(), log_DBG_m, log_ERR_m, log_FUNC_A_m, log_WriteEvent(), m_iRM, m_serialUnload, Reconfigure(), and ipc_Corba::ResolveRM().

  : m_libName (a_libName),
    m_active(false) {

    log_FUNC_A_m(i_LibraryAgentSCSI_i, "libName: " << a_libName);

    ipc_EXEC_m(
        CORBA::Object_var obj = ipc_Corba::ResolveRM();
        m_iRM = i_ResourceManager::_narrow(obj);
    );

    i_Library_t_var lib;
    try {
        ipc_EXEC_m(
            lib = m_iRM->SelectLibrary( CORBA::string_dup(a_libName.c_str()) );
        );
    }
    catch (...) {
        log_WriteEvent(evt_ERROR,
            "Can't get library control device for." + a_libName);

        log_ERR_m(
            "Can't get library's control device for " <<
            a_libName);

        throw;
    };

    string serial = cmn_GetEnvVariable(la_serialUnload_c);
    if (serial.length() > 0) {
        log_DBG_m(dbg_LOW, la_serialUnload_c << " = " << serial << ".");
        cmn_StrUpperCase(serial);

        if (serial.compare("TRUE") == 0 || serial.compare("YES") == 0) {
            log_DBG_m(dbg_LOW, "Unloads will be serialised.");
            m_serialUnload = true;
        }
    }

    log_DBG_m(dbg_LOW, endl <<
        "** Starting library agent **" << endl <<
        " - Name      : " << a_libName << endl );
    Reconfigure(lib);
}

Here is the call graph for this function:

i_LibraryAgentSCSI_i::~i_LibraryAgentSCSI_i (  )  [private, virtual]

Definition at line 117 of file i_la-s_impl.cpp.

References la_SCSILibrary::Close(), dbg_LOW, ivd_Sleep, log_DBG_m, log_FUNC_m, m_active, m_scsiLib, and ipc_Corba::Shutdown().

                                            {
    log_FUNC_m(~i_LibraryAgentSCSI_i);

    while (m_active) {
        log_DBG_m(dbg_LOW,
            "Library Agent performing an action. Waiting.");
        ivd_Sleep(1);
    };

    m_scsiLib.Close();

    ipc_Corba::Shutdown();
}

Here is the call graph for this function:


Member Function Documentation

void i_LibraryAgentSCSI_i::ConfirmMountRequest ( const char *  a_drive,
CORBA::Boolean  a_ok 
)

Definition at line 460 of file i_la-s_impl.cpp.

References dbg_NORM, log_DBG_m, and log_FUNC_A_m.

                                                                  {
    log_FUNC_A_m(ConfirmMountRequest, "drive: " << a_drive << " ok: " << a_ok);

    log_DBG_m(dbg_NORM, "Mount request reply - ignored");
}

void i_LibraryAgentSCSI_i::Inventory ( CORBA::Boolean  a_force  ) 

Definition at line 226 of file i_la-s_impl.cpp.

References cmn_Num2Str(), dbg_DETAIL, evt_ERROR, ivd_BaseException::GetFriendly(), la_SCSILibrary::HasBarcodeReader(), ie_FATAL_ERROR, la_SCSILibrary::Inventory(), ipc_EXEC_m, ivd_Error, log_DBG_m, log_FUNC_A_m, log_WriteEvent(), m_active, m_iRM, m_lib_x, m_libName, and m_scsiLib.

Referenced by Reconfigure().

                                                         {

    log_FUNC_A_m(Inventory, "force: " << (a_force? "Yes" : "No"));

    if (!m_scsiLib.HasBarcodeReader()) {
        log_WriteEvent("Inventory skipped: no barcode reader");

        return;
    }

    cmn_MutexLock l(m_lib_x);
    la_ActiveMark a(m_active);

    try {

        try {
            vector<data_ElementStatus::ElemStatus_t> elementStatus;

            m_scsiLib.Inventory(a_force, elementStatus);

            log_DBG_m(dbg_DETAIL,
                    "Got " << elementStatus.size() << " elements from library.");

            i_UpdateList_t libUpdate;

            libUpdate.length(elementStatus.size());

            for (UInt32_t i = 0; i < elementStatus.size(); i++) {
                libUpdate[i].type       = elementStatus[i].type;
                libUpdate[i].slot       =
                    CORBA::string_dup(cmn_Num2Str(elementStatus[i].slot).c_str());
                libUpdate[i].isFull     = elementStatus[i].full;
                libUpdate[i].barcode    = CORBA::string_dup(elementStatus[i].barcode);
                libUpdate[i].barcode2   = CORBA::string_dup(elementStatus[i].barcode2);
            }

            log_DBG_m(dbg_DETAIL, "About to update RMDB");

            ipc_EXEC_m(
                m_iRM->InventoryUpdate(
                    CORBA::string_dup(m_libName.c_str()),
                    libUpdate );
            );

            ostringstream sstr;
            sstr
                << "Inventory "
                << (a_force? "with barcode rescan." : "");

            log_WriteEvent(sstr.str());
        }
        catch (ivd_Exception &ie) {
            ostringstream sstr;
            sstr << "Inventory FAILED (" << ie.GetFriendly() << ")";
            log_WriteEvent(evt_ERROR, sstr.str());
            throw;
        }
        catch (std::exception &se) {
            ostringstream sstr;
            sstr << "Inventory FAILED (" << se.what() << ")";
            log_WriteEvent(evt_ERROR, sstr.str());
            throw;
        }
        catch (...) {
            log_WriteEvent(evt_ERROR, "Inventory FAILED");

            throw ivd_Error(
                ie_FATAL_ERROR, "Unknown exception performing Inventory.");
        }
    } ipc_CATCH_IVD_THROW_CORBA_m;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void i_LibraryAgentSCSI_i::Load ( const char *  a_slot,
const char *  a_drive,
const char *  a_barcode,
i_JobID_t  a_jobID 
)

Definition at line 298 of file i_la-s_impl.cpp.

References evt_ERROR, ivd_BaseException::GetFriendly(), ie_FATAL_ERROR, ipc_EXEC_m, ivd_Error, la_SCSILibrary::Load(), log_FUNC_A_m, log_WriteEvent(), m_active, m_iRM, m_lib_x, m_libName, and m_scsiLib.

                       {

    log_FUNC_A_m(Load,
        "slot: " << a_slot <<
        " drive: " << a_drive <<
        " barcode: " << a_barcode <<
        " job: " << a_jobID);

    cmn_MutexLock l(m_lib_x);
    la_ActiveMark a(m_active);

    try {
        try {
            UInt16_t slot   = atoi(a_slot);
            UInt16_t drive  = atoi(a_drive);
            string barcode  = string(a_barcode);

            m_scsiLib.Load(slot, drive, barcode);

            ipc_EXEC_m(
                m_iRM->MediumLoaded(
                    CORBA::string_dup(m_libName.c_str()),
                    CORBA::string_dup(a_barcode),
                    CORBA::string_dup(a_drive) );
            );

            ostringstream sstr;
            sstr << "Move: D=" << a_drive << " <- S=" << a_slot;
            log_WriteEvent(sstr.str(), "", a_jobID, a_barcode);
        }
        catch (ivd_Exception &ie) {
            ostringstream sstr;
            sstr
                << "Move: D=" << a_drive << " <- S=" << a_slot << " FAILED ("
                << ie.GetFriendly() << ")";
            log_WriteEvent(evt_ERROR, sstr.str(), "", a_jobID, a_barcode);

            throw;
        }
        catch (...) {
            ostringstream sstr;
            sstr << "Move: D=" << a_drive << " <- S=" << a_slot << " FAILED";
            log_WriteEvent(evt_ERROR, sstr.str(), "", a_jobID, a_barcode);

            throw ivd_Error(
                ie_FATAL_ERROR, "Unknown exception performing Load.");
        }
    } ipc_CATCH_IVD_THROW_CORBA_m;
}

Here is the call graph for this function:

vector< la_SCSILibrary::DriveInfo > i_LibraryAgentSCSI_i::ReadDriveInfo (  )  [private]

Definition at line 131 of file i_la-s_impl.cpp.

References dbg_DETAIL, dbg_LOW, dbg_NORM, i_Drive_t::driveIndex, i_Drive_t::driveKey, i_Drive_t::driveName, g_cmn, la_SCSILibrary::GetNumDrives(), index, ipc_EXEC_m, i_Drive_t::libraryName, log_DBG_m, log_FUNC_m, log_WRN_m, cmn_SysInfo::m_hostName, m_iRM, m_libName, m_scsiLib, and cmn_Global::si.

Referenced by Reconfigure(), and Unload().

                                                                    {
    log_FUNC_m(ReadDriveInfo);

    vector<la_SCSILibrary::DriveInfo> deviceIDs;

    try {
        i_DriveSeq_t_var drives;
        ipc_EXEC_m( drives = m_iRM->SelectAllDrives(); );

        UInt16_t numDrives(0);
        ipc_EXEC_m( numDrives = m_scsiLib.GetNumDrives(); );

        //
        // Resize the vector to reflect actual
        // state in the ITL.
        // Drives that are not configured, will have empty
        // control device name.
        //
        deviceIDs.resize(numDrives);

        for (UInt32_t i = 0; i < drives->length(); i++) {

            i_Drive_t drive = drives[i];

            log_DBG_m(dbg_DETAIL,
                "Got drive idx: " << drive.driveIndex <<
                " : " << drive.driveName <<
                " from " << drive.libraryName);

            if (m_libName.compare(drive.libraryName) == 0) {

                UInt16_t index = atoi(drive.driveIndex);

                if (index <= numDrives && index > 0) {

                    i_DriveHost_t_var drvHost;
                    try {
                        ipc_EXEC_m(
                            drvHost = m_iRM->SelectDriveHost(
                                CORBA::string_dup(drive.driveName),
                                CORBA::string_dup(g_cmn.si.m_hostName.c_str()) );
                        );
                    }
                    catch (const ivd_Exception) {
                        log_WRN_m(
                            "Can't get device fie for drive: " << drive.driveName <<
                            ". Possible problems when unloading from this drive.");

                        continue;
                    };

                    log_DBG_m(dbg_DETAIL,
                        "Got device ID: " << index <<
                        " : " << drvHost->controlDevice);

                    deviceIDs[index-1].scsiID = string(drvHost->controlDevice);
                    deviceIDs[index-1].drvKey = drive.driveKey;

                    log_DBG_m(dbg_NORM,
                        drive.driveIndex << " : " <<
                        drive.driveName << ", " << drvHost->controlDevice);

                }
                else {
                    log_WRN_m(
                        "LA startup: Drive index out of range:" <<
                        drive.driveName << " " << drive.driveIndex);
                }
            } // if (m_lib
        } // for
    } //try
    catch (ivd_Exception &ie) {
        log_WRN_m(
            "Library Agent can't get tape drive info from RM." <<
            endl << "Error: " << ie);
        throw;
    }
    catch (...) {
        log_WRN_m(
            "Library Agent can't get tape drive info from RM." <<
            endl << "Error unknown.");
        throw;
    }

    for (UInt32_t i = 0; i < deviceIDs.size(); i++) {
        if (deviceIDs[i].scsiID.empty()) {
            log_DBG_m(dbg_LOW, "Unconfigured tape drive index " << (i+1));
        }
    }

    return deviceIDs;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void i_LibraryAgentSCSI_i::Reconfigure ( const i_Library_t a_libCfg  ) 

Definition at line 467 of file i_la-s_impl.cpp.

References la_SCSILibrary::Close(), i_Library_t::controlDevice, dbg_DETAIL, dbg_LOW, ivd_BaseException::GetError(), ie_SCSI_OPEN, Inventory(), ivd_Error, log_DBG_m, log_FUNC_m, log_WriteEvent(), log_WRN_m, m_scsiLib, la_SCSILibrary::MustRequestEject(), la_SCSILibrary::Open(), ReadDriveInfo(), la_SCSILibrary::SetDeviceID(), la_SCSILibrary::SetDriveIDs(), and UpdateIDs().

Referenced by i_LibraryAgentSCSI_i().

                                                                  {
    log_FUNC_m(Reconfigure);

    try {
        m_scsiLib.Close();

        string deviceID = string(a_libCfg.controlDevice);
        m_scsiLib.SetDeviceID(deviceID);

        try{
            m_scsiLib.Open();
        }
        catch (ivd_Exception &ie){
            ostringstream sstr;
            if ( ie.GetError() == ie_LA_UNSUPPORTED ){
                log_DBG_m(dbg_DETAIL,"Cannot open SCSI, Library not supported!");
                throw ie;
            }
            else{
                log_DBG_m(dbg_DETAIL,"Cannot open SCSI!");
                sstr << "Device not found: " << string(a_libCfg.controlDevice);
            }
            throw ivd_Error(ie_SCSI_OPEN, sstr.str());
        }

        if (m_scsiLib.MustRequestEject()) {
            try {
                // Must get device IDs of tape drives to perform eject.
                vector<la_SCSILibrary::DriveInfo> driveIDs = ReadDriveInfo();
                m_scsiLib.SetDriveIDs(driveIDs);
            }
            catch (ivd_Exception) {
                log_WRN_m("Can't read tape drive information at startup. Will try later.");
            }
        };

        // Perform library inventory (w/out INIT ELEMENT STATUS).
        Inventory(false);
        log_WriteEvent("Library reconfigured.");

        log_DBG_m(dbg_LOW, "Device ID : " << deviceID );

        UpdateIDs(a_libCfg);
    } ipc_CATCH_IVD_THROW_CORBA_m;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void i_LibraryAgentSCSI_i::Remove (  )  [virtual]

Reimplemented from i_Component_i.

Definition at line 513 of file i_la-s_impl.cpp.

References log_FUNC_m.

void i_LibraryAgentSCSI_i::Unload ( const char *  a_drive,
const char *  a_slot,
const char *  a_barcode,
i_JobID_t  a_jobID 
)

Definition at line 352 of file i_la-s_impl.cpp.

References dbg_NORM, evt_ERROR, ivd_BaseException::GetError(), ivd_BaseException::GetFriendly(), ie_FATAL_ERROR, ipc_EXEC_m, ivd_Error, log_DBG_m, log_FUNC_A_m, log_WriteEvent(), m_active, m_iRM, m_lib_x, m_libName, m_scsiLib, m_serialUnload, m_serialUnload_x, la_SCSILibrary::MustRequestEject(), ReadDriveInfo(), rmdb_MEDIUM_IN_USE, la_SCSILibrary::SetDriveIDs(), and la_SCSILibrary::Unload().

                         {

    log_FUNC_A_m(Unload,
        "drive: " << a_drive <<
        " slot: " << a_slot <<
        " barcode: " << a_barcode <<
        " job: " << a_jobID);

    la_ActiveMark a(m_active);

    // Auto pointer is used to serialise unloads if required.
    // By default unloads (medium ejects) are done in parallel.
    auto_ptr<cmn_MutexLock> l_ap;
    if (m_serialUnload) {
        l_ap.reset(new cmn_MutexLock(m_serialUnload_x));
    }

    try {
        try {

            UInt16_t drive  = atoi(a_drive);
            UInt16_t slot   = atoi(a_slot);
            string barcode  = string(a_barcode);

            //
            // If unconfigured drive situation is detected
            // then re-read the configuration
            // and retry once more.
            //
            bool retried = false;
            do {
                try {
                    m_scsiLib.Unload(drive, slot, barcode);
                    // NOTE: If unload is successfull, just break out.
                    break;
                }
                catch (ivd_Error &ie) {
                    cmn_MutexLock l(m_lib_x);
                    {
                        //if unload fails release medium
                        ipc_EXEC_m(
                            m_iRM->MediumStatusClear(
                            CORBA::string_dup(a_barcode),
                            rmdb_MEDIUM_IN_USE);
                        );

                    }

                    if (!retried && ie.GetError() == ie_LA_UNCONFIGURED) {
                        retried = true;

                        log_DBG_m(dbg_NORM,
                            "Unconfigured drive situation. " <<
                            "Re-read drive info and retry.");

                        if (m_scsiLib.MustRequestEject()) {
                            // Must get device IDs of tape drives to perform eject.
                            vector<la_SCSILibrary::DriveInfo> driveIDs = ReadDriveInfo();
                            m_scsiLib.SetDriveIDs(driveIDs);
                        };
                    }
                    else {
                        log_DBG_m(dbg_NORM,
                            "Already retried or not ie_LA_UNCONFIGURED: " << endl << ie);
                        throw;
                    }
                } // Protected by mutex to here
            } while (1);

            {
                cmn_MutexLock l(m_lib_x);
                ipc_EXEC_m(
                    m_iRM->MediumUnLoaded(
                        CORBA::string_dup(m_libName.c_str()),
                        CORBA::string_dup(a_barcode),
                        CORBA::string_dup(a_slot),
                        rmdb_REP_SLOT_TYPE_ID );
                );

                ostringstream sstr;
                sstr << "Move: D=" << a_drive << " -> S=" << a_slot;
                log_WriteEvent(sstr.str(), "", a_jobID, a_barcode);
            } // Protected by mutex to here
        }
        catch (ivd_Exception &ie) {
            ostringstream sstr;
            sstr
                << "Move: D=" << a_drive << " -> S=" << a_slot << " FAILED ("
                << ie.GetFriendly() << ")";
            log_WriteEvent(evt_ERROR, sstr.str(), "", a_jobID, a_barcode);

            throw ;
        }
        catch (...) {
            ostringstream sstr;
            sstr << "Move: D=" << a_drive << " -> S=" << a_slot << " FAILED";
            log_WriteEvent(evt_ERROR, sstr.str(), "", a_jobID, a_barcode);

            throw ivd_Error(
                ie_FATAL_ERROR, "Unknown exception performing Unload.");
        }
    } ipc_CATCH_IVD_THROW_CORBA_m;
}

Here is the call graph for this function:

void i_LibraryAgentSCSI_i::UpdateIDs ( i_Library_t  a_lib  )  [private]

Definition at line 519 of file i_la-s_impl.cpp.

References dbg_LOW, dbg_NORM, evt_WARNING, i_Library_t::firmwareRev, ivd_BaseException::GetFriendly(), la_SCSILibrary::GetProductID(), la_SCSILibrary::GetProductRevision(), la_SCSILibrary::GetSCSIID(), la_SCSILibrary::GetSerialNumber(), la_SCSILibrary::GetVendorID(), ipc_EXEC_m, i_Library_t::libraryName, log_DBG_m, log_FUNC_m, log_WriteEvent(), m_iRM, m_scsiLib, i_Library_t::productID, i_Library_t::scsiID, i_Library_t::serialNo, and i_Library_t::vendorID.

Referenced by Reconfigure().

                                                      {
    log_FUNC_m(UpdateDriveIDs);

    try {
        bool    needsUpdate(false);

        const string& vid = m_scsiLib.GetVendorID();
        if (vid.compare(a_lib.vendorID) != 0) {
            if (strlen(a_lib.vendorID) > 0) {
                ostringstream sstr;
                sstr
                    << a_lib.libraryName
                    << ": Changed vendor ID from " << a_lib.vendorID
                    << " to " << vid << ".";
                log_WriteEvent(
                    evt_WARNING, sstr.str(), "", 0,
                    (const char*)(a_lib.libraryName) );
            }
            else {
                log_DBG_m(dbg_LOW, "Updating vendor ID: " << vid);
            }
            a_lib.vendorID = CORBA::string_dup(vid.c_str());
            needsUpdate = true;
        };

        const string& pid = m_scsiLib.GetProductID();
        if (pid.compare(a_lib.productID) != 0) {
            if (strlen(a_lib.productID) > 0) {
                ostringstream sstr;
                sstr
                    << a_lib.libraryName
                    << ": Changed product ID from " << a_lib.productID
                    << " to " << pid << ".";
                log_WriteEvent(
                    evt_WARNING, sstr.str(), "", 0,
                    (const char*)(a_lib.libraryName) );
            }
            else {
                log_DBG_m(dbg_LOW, "Updating product ID: " << pid);
            }
            a_lib.productID = CORBA::string_dup(pid.c_str());
            needsUpdate = true;
        };

        const string& rev = m_scsiLib.GetProductRevision();
        if (rev.compare(a_lib.firmwareRev) != 0) {
            if (strlen(a_lib.firmwareRev) > 0) {
                ostringstream sstr;
                sstr
                    << a_lib.libraryName
                    << ": Changed product revision from " << a_lib.firmwareRev
                    << " to " << rev << ".";
                log_WriteEvent(
                    evt_WARNING, sstr.str(), "", 0,
                    (const char*)(a_lib.libraryName) );
            }
            else {
                log_DBG_m(dbg_LOW, "Updating product revision: " << rev);
            }
            a_lib.firmwareRev = CORBA::string_dup(rev.c_str());
            needsUpdate = true;
        };

        string sid = m_scsiLib.GetSCSIID();
        if (sid.compare(a_lib.scsiID) != 0) {
            if (strlen(a_lib.scsiID) > 0) {
                ostringstream sstr;
                sstr
                    << a_lib.libraryName
                    << ": Changed SCSI ID from " << a_lib.scsiID
                    << " to " << sid << ".";
                log_WriteEvent(
                    evt_WARNING, sstr.str(), "", 0,
                    (const char*)(a_lib.libraryName) );
            }
            else {
                log_DBG_m(dbg_LOW, "Updating SCSI ID: " << rev);
            }
            a_lib.scsiID = CORBA::string_dup(sid.c_str());
            needsUpdate = true;
        };

        const string& sn = m_scsiLib.GetSerialNumber();
        if (sn.compare(a_lib.serialNo) != 0) {
            if (strlen(a_lib.serialNo) > 0) {
                ostringstream sstr;
                sstr
                    << a_lib.libraryName
                    << ": Changed serial number from " << a_lib.serialNo
                    << " to " << sn << ".";
                log_WriteEvent(
                    evt_WARNING, sstr.str(), "", 0,
                    (const char*)(a_lib.libraryName) );
            }
            else {
                log_DBG_m(dbg_LOW, "Updating s/n: " << a_lib.serialNo);
            }
            a_lib.serialNo = CORBA::string_dup(sn.c_str());
            needsUpdate = true;
        };

        if (needsUpdate) {
            ipc_EXEC_m(
                m_iRM->UpdateLibrary(a_lib);
            );
        }
    }
    catch (const ivd_Exception& ie) {
        log_DBG_m(dbg_NORM, "Error updating RMDB: " << ie.GetFriendly());
    }
    catch (...) {
        log_DBG_m(dbg_NORM, "Error updating RMDB. ");
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:


Friends And Related Function Documentation

friend class la_SCSILibrary [friend]

Definition at line 70 of file i_la-s_impl.h.


Member Data Documentation

Reimplemented from i_Component_i.

Definition at line 73 of file i_la-s_impl.h.

Definition at line 80 of file i_la-s_impl.h.

Referenced by Inventory(), Load(), Unload(), and ~i_LibraryAgentSCSI_i().

i_ResourceManager_var i_LibraryAgentSCSI_i::m_iRM [private]

Definition at line 82 of file i_la-s_impl.h.

Referenced by i_LibraryAgentSCSI_i(), Inventory(), Load(), ReadDriveInfo(), Unload(), and UpdateIDs().

Definition at line 77 of file i_la-s_impl.h.

Referenced by Inventory(), Load(), and Unload().

Definition at line 76 of file i_la-s_impl.h.

Referenced by Inventory(), Load(), ReadDriveInfo(), and Unload().

Definition at line 79 of file i_la-s_impl.h.

Referenced by i_LibraryAgentSCSI_i(), and Unload().

Definition at line 78 of file i_la-s_impl.h.

Referenced by Unload().


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