]> sigrok.org Git - pulseview.git/blobdiff - pv/device/device.cpp
Fix double-free issue in File::create
[pulseview.git] / pv / device / device.cpp
index ca18fc13a73e2f63432832a9b536568d658f0437..546ce391869f81c52a86116326e034972ebb2df2 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
+#include <cassert>
 #include <sstream>
 
 #include <libsigrok/libsigrok.h>
 
 #include "device.h"
 
+using std::list;
+using std::make_pair;
+using std::map;
 using std::ostringstream;
 using std::string;
 
@@ -31,8 +35,36 @@ namespace pv {
 namespace device {
 
 Device::Device(sr_dev_inst *sdi) :
-       DevInst(sdi)
+       _sdi(sdi)
 {
+       assert(_sdi);
+}
+
+sr_dev_inst* Device::dev_inst() const
+{
+       return _sdi;
+}
+
+void Device::use(SigSession *owner) throw(QString)
+{
+       DevInst::use(owner);
+
+       sr_session_new(&SigSession::_sr_session);
+
+       assert(_sdi);
+       sr_dev_open(_sdi);
+       if (sr_session_dev_add(SigSession::_sr_session, _sdi) != SR_OK)
+               throw QString(tr("Failed to use device."));
+}
+
+void Device::release()
+{
+       if (_owner) {
+               DevInst::release();
+               sr_session_destroy(SigSession::_sr_session);
+       }
+
+       sr_dev_close(_sdi);
 }
 
 std::string Device::format_device_title() const
@@ -41,24 +73,51 @@ std::string Device::format_device_title() const
 
        assert(_sdi);
 
-       if (_sdi->vendor && _sdi->vendor[0]) {
-               s << _sdi->vendor;
-               if ((_sdi->model && _sdi->model[0]) ||
-                       (_sdi->version && _sdi->version[0]))
-                       s << ' ';
-       }
+       if (_sdi->vendor && _sdi->vendor[0])
+               s << _sdi->vendor << " ";
 
-       if (_sdi->model && _sdi->model[0]) {
-               s << _sdi->model;
-               if (_sdi->version && _sdi->version[0])
-                       s << ' ';
-       }
+       if (_sdi->model && _sdi->model[0])
+               s << _sdi->model << " ";
 
        if (_sdi->version && _sdi->version[0])
-               s << _sdi->version;
+               s << _sdi->version << " ";
+
+       // Show connection string only if no serial number is present.
+       if (_sdi->serial_num && _sdi->serial_num[0])
+               s << "(" << _sdi->serial_num << ") ";
+       else if (_sdi->connection_id && _sdi->connection_id[0])
+               s << "[" << _sdi->connection_id << "] ";
+
+       // Remove trailing space.
+       s.seekp(-1, std::ios_base::end);
+       s << std::ends;
 
        return s.str();
 }
 
+map<string, string> Device::get_device_info() const
+{
+       map<string, string> result;
+
+       assert(_sdi);
+
+       if (_sdi->vendor && _sdi->vendor[0])
+               result.insert(make_pair("vendor", _sdi->vendor));
+
+       if (_sdi->model && _sdi->model[0])
+               result.insert(make_pair("model", _sdi->model));
+
+       if (_sdi->version && _sdi->version[0])
+               result.insert(make_pair("version", _sdi->version));
+
+       if (_sdi->serial_num && _sdi->serial_num[0])
+               result.insert(make_pair("serial_num", _sdi->serial_num));
+
+       if (_sdi->connection_id && _sdi->connection_id[0])
+               result.insert(make_pair("connection_id", _sdi->connection_id));
+
+       return result;
+}
+
 } // device
 } // pv