{
int ret = 0;
+ // Open device
if (description.empty() && serial.empty())
ret = ftdi_usb_open(d->ftdi, vendor, product);
else
ret = ftdi_usb_open_desc(d->ftdi, vendor, product, description.c_str(), serial.c_str());
- d->dev = usb_device(d->ftdi->usb_dev);
+ if (ret < 0)
+ return ret;
- if ((ret = ftdi_usb_open_dev(d->ftdi, d->dev)) >= 0)
- {
- d->open = true;
- get_strings();
- }
+ // Get device strings (closes device)
+ get_strings();
+
+ // Reattach device
+ ret = ftdi_usb_open_dev(d->ftdi, d->dev);
+ d->open = (ret >= 0);
return ret;
}
int Context::open(struct usb_device *dev)
{
- int ret = 0;
-
if (dev != 0)
d->dev = dev;
if (d->dev == 0)
return -1;
- if ((ret = ftdi_usb_open_dev(d->ftdi, d->dev)) >= 0)
- {
- d->open = true;
- get_strings();
- }
+ // Get device strings (closes device)
+ get_strings();
+
+ // Reattach device
+ int ret = ftdi_usb_open_dev(d->ftdi, d->dev);
+ d->open = (ret >= 0);
return ret;
}
return 1;
}
-/*! \fn vendor
- * \fn description
- * \fn serial
- * \brief Device strings properties.
+/*! \brief Device strings properties.
*/
const std::string& Context::vendor()
{
return d->vendor;
}
+/*! \brief Device strings properties.
+ */
const std::string& Context::description()
{
return d->description;
}
+/*! \brief Device strings properties.
+ */
const std::string& Context::serial()
{
return d->serial;
{
}
-int List::size()
+/**
+* Return begin iterator for accessing the contained list elements
+* @return Iterator
+*/
+List::iterator List::begin()
{
- return d->list.size();
+ return d->list.begin();
}
-void List::push_front(const Context& element)
+/**
+* Return end iterator for accessing the contained list elements
+* @return Iterator
+*/
+List::iterator List::end()
{
- d->list.push_front(element);
+ return d->list.end();
}
+/**
+* Return begin iterator for accessing the contained list elements
+* @return Const iterator
+*/
+List::const_iterator List::begin() const
+{
+ return d->list.begin();
+}
-void List::push_back(const Context& element)
+/**
+* Return end iterator for accessing the contained list elements
+* @return Const iterator
+*/
+List::const_iterator List::end() const
+{
+ return d->list.end();
+}
+
+/**
+* Return begin reverse iterator for accessing the contained list elements
+* @return Reverse iterator
+*/
+List::reverse_iterator List::rbegin()
+{
+ return d->list.rbegin();
+}
+
+/**
+* Return end reverse iterator for accessing the contained list elements
+* @return Reverse iterator
+*/
+List::reverse_iterator List::rend()
+{
+ return d->list.rend();
+}
+
+/**
+* Return begin reverse iterator for accessing the contained list elements
+* @return Const reverse iterator
+*/
+List::const_reverse_iterator List::rbegin() const
+{
+ return d->list.rbegin();
+}
+
+/**
+* Return end reverse iterator for accessing the contained list elements
+* @return Const reverse iterator
+*/
+List::const_reverse_iterator List::rend() const
+{
+ return d->list.rend();
+
+}
+
+/**
+* Get number of elements stored in the list
+* @return Number of elements
+*/
+List::ListType::size_type List::size() const
+{
+ return d->list.size();
+}
+
+/**
+* Check if list is empty
+* @return True if empty, false otherwise
+*/
+bool List::empty() const
{
- d->list.push_back(element);
+ return d->list.empty();
}
+/**
+ * Removes all elements. Invalidates all iterators.
+ * Do it in a non-throwing way and also make
+ * sure we really free the allocated memory.
+ */
void List::clear()
{
- d->list.clear();
+ ListType().swap(d->list);
// Free device list
- ftdi_list_free(&d->devlist);
- d->devlist = 0;
+ if (d->devlist)
+ {
+ ftdi_list_free(&d->devlist);
+ d->devlist = 0;
+ }
+}
+
+/**
+ * Appends a copy of the element as the new last element.
+ * @param element Value to copy and append
+*/
+void List::push_back(const Context& element)
+{
+ d->list.push_back(element);
}
-std::list<Context>::iterator List::begin()
+/**
+ * Adds a copy of the element as the new first element.
+ * @param element Value to copy and add
+*/
+void List::push_front(const Context& element)
{
- return d->list.begin();
+ d->list.push_front(element);
}
-std::list<Context>::iterator List::end()
+/**
+ * Erase one element pointed by iterator
+ * @param pos Element to erase
+ * @return Position of the following element (or end())
+*/
+List::iterator List::erase(iterator pos)
{
- return d->list.end();
+ return d->list.erase(pos);
}
+/**
+ * Erase a range of elements
+ * @param beg Begin of range
+ * @param end End of range
+ * @return Position of the element after the erased range (or end())
+*/
+List::iterator List::erase(iterator beg, iterator end)
+{
+ return d->list.erase(beg, end);
+}
List* List::find_all(int vendor, int product)
{