127 lines
2.6 KiB
C++
127 lines
2.6 KiB
C++
#include "HGLibDeviceImpl.hpp"
|
|
#include "base/HGInc.h"
|
|
#include "base/HGInfo.h"
|
|
#include "HGString.h"
|
|
|
|
HGLock HGLibDeviceImpl::m_lock = NULL;
|
|
HGLibDeviceHotPlugEventFunc HGLibDeviceImpl::m_hotPlugEventFunc = NULL;
|
|
HGPointer HGLibDeviceImpl::m_hotPlugEventParam = NULL;
|
|
HGBool HGLibDeviceImpl::m_init = HGFALSE;
|
|
std::vector<std::string> HGLibDeviceImpl::m_devNameList;
|
|
|
|
HGLibDeviceImpl::HGLibDeviceImpl()
|
|
{
|
|
|
|
}
|
|
|
|
HGLibDeviceImpl::~HGLibDeviceImpl()
|
|
{
|
|
|
|
}
|
|
|
|
HGBool HGLibDeviceImpl::Init(HGLibDeviceHotPlugEventFunc func, HGPointer param)
|
|
{
|
|
if (m_init)
|
|
{
|
|
return HGFALSE;
|
|
}
|
|
|
|
assert(NULL == m_lock);
|
|
HGBase_CreateLock(&m_lock);
|
|
assert(NULL == m_hotPlugEventFunc);
|
|
m_hotPlugEventFunc = func;
|
|
m_hotPlugEventParam = param;
|
|
|
|
SANE_Int version_code = 0;
|
|
if (SANE_STATUS_GOOD != sane_init_ex(&version_code, sane_ex_callback, NULL))
|
|
{
|
|
m_hotPlugEventFunc = NULL;
|
|
m_hotPlugEventParam = NULL;
|
|
HGBase_DestroyLock(m_lock);
|
|
m_lock = NULL;
|
|
return HGFALSE;
|
|
}
|
|
|
|
m_init = HGTRUE;
|
|
return HGTRUE;
|
|
}
|
|
|
|
HGBool HGLibDeviceImpl::Deinit()
|
|
{
|
|
if (!m_init)
|
|
{
|
|
return HGFALSE;
|
|
}
|
|
|
|
sane_exit();
|
|
m_hotPlugEventFunc = NULL;
|
|
m_hotPlugEventParam = NULL;
|
|
HGBase_DestroyLock(m_lock);
|
|
m_lock = NULL;
|
|
m_init = HGFALSE;
|
|
return HGTRUE;
|
|
}
|
|
|
|
HGChar** HGLibDeviceImpl::GetNameList()
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
HGBool HGLibDeviceImpl::ReleaseNameList(HGChar** deviceName)
|
|
{
|
|
if (NULL == deviceName)
|
|
{
|
|
return HGFALSE;
|
|
}
|
|
|
|
while (0 != *deviceName)
|
|
{
|
|
free(*deviceName);
|
|
++deviceName;
|
|
}
|
|
|
|
free(deviceName);
|
|
return HGTRUE;
|
|
}
|
|
|
|
int HGLibDeviceImpl::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param)
|
|
{
|
|
switch (code)
|
|
{
|
|
case SANE_EVENT_DEVICE_ARRIVED:
|
|
{
|
|
SANE_Device* sane_dev = (SANE_Device*)data;
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_DEVICE_ARRIVED, name=%s", Utf8ToStdString(sane_dev->name).c_str());
|
|
|
|
HGBase_EnterLock(m_lock);
|
|
m_devNameList.push_back(sane_dev->name);
|
|
HGBase_LeaveLock(m_lock);
|
|
|
|
if (NULL != m_hotPlugEventFunc)
|
|
m_hotPlugEventFunc(HGLIB_DEVHOTPLUG_EVENT_ARRIVE, sane_dev->name, m_hotPlugEventParam);
|
|
}
|
|
break;
|
|
case SANE_EVENT_DEVICE_LEFT:
|
|
{
|
|
SANE_Device* sane_dev = (SANE_Device*)data;
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_DEVICE_LEFT, name=%s", Utf8ToStdString(sane_dev->name).c_str());
|
|
|
|
if (NULL != m_hotPlugEventFunc)
|
|
m_hotPlugEventFunc(HGLIB_DEVHOTPLUG_EVENT_REMOVE, sane_dev->name, m_hotPlugEventParam);
|
|
|
|
HGBase_EnterLock(m_lock);
|
|
for (int i = 0; i < (int)m_devNameList.size(); ++i)
|
|
{
|
|
if (0 == strcmp(sane_dev->name, m_devNameList[i].c_str()))
|
|
{
|
|
m_devNameList.erase(m_devNameList.begin() + i);
|
|
break;
|
|
}
|
|
}
|
|
HGBase_LeaveLock(m_lock);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
} |