const gchar * mm_port_probe_get_port_subsys (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), NULL); return g_udev_device_get_subsystem (self->priv->port); }
const gchar * mm_port_probe_get_port_driver (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), NULL); return self->priv->driver; }
GUdevDevice * mm_port_probe_get_port (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), NULL); return self->priv->port; };
const gchar * mm_port_probe_get_port_physdev (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), NULL); return self->priv->physdev_path; }
MMPortType mm_port_probe_get_port_type (MMPortProbe *self) { const gchar *subsys; const gchar *name; g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); subsys = g_udev_device_get_subsystem (self->priv->port); name = g_udev_device_get_name (self->priv->port); if (g_str_equal (subsys, "net")) return MM_PORT_TYPE_NET; #if defined WITH_QMI if (g_str_has_prefix (subsys, "usb") && g_str_has_prefix (name, "cdc-wdm") && self->priv->is_qmi) return MM_PORT_TYPE_QMI; #endif if (self->priv->flags & MM_PORT_PROBE_QCDM && self->priv->is_qcdm) return MM_PORT_TYPE_QCDM; if (self->priv->flags & MM_PORT_PROBE_AT && self->priv->is_at) return MM_PORT_TYPE_AT; return MM_PORT_TYPE_UNKNOWN; }
GUdevDevice * mm_port_probe_get_port (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), NULL); return G_UDEV_DEVICE (g_object_ref (self->priv->port)); };
MMDevice * mm_port_probe_get_device (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), NULL); return MM_DEVICE (g_object_ref (self->priv->device)); }
MMDevice * mm_port_probe_peek_device (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), NULL); return self->priv->device; }
gboolean mm_port_probe_is_icera (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); if (g_str_equal (g_udev_device_get_subsystem (self->priv->port), "net")) return FALSE; return (self->priv->flags & MM_PORT_PROBE_AT_ICERA ? self->priv->is_icera : FALSE); }
const gchar * mm_port_probe_get_product (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), NULL); if (g_str_equal (self->priv->subsys, "net")) return NULL; /* Warn if it wasn't probed */ g_return_val_if_fail (self->priv->flags & MM_PORT_PROBE_AT_PRODUCT, NULL); return self->priv->product; }
gboolean mm_port_probe_is_qcdm (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); if (g_str_equal (self->priv->subsys, "net")) return FALSE; /* Warn if it wasn't probed */ g_return_val_if_fail (self->priv->flags & MM_PORT_PROBE_QCDM, FALSE); return self->priv->is_qcdm; }
gboolean mm_port_probe_run_cancel (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); if (self->priv->task) { mm_dbg ("(%s) requested to cancel the probing", self->priv->name); g_cancellable_cancel (self->priv->task->cancellable); return TRUE; } return FALSE; }
gboolean mm_port_probe_run_cancel (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); if (self->priv->task) { mm_dbg ("(%s/%s) requested to cancel the probing", g_udev_device_get_subsystem (self->priv->port), g_udev_device_get_name (self->priv->port)); g_cancellable_cancel (self->priv->task->cancellable); return TRUE; } return FALSE; }
gboolean mm_port_probe_is_qmi (MMPortProbe *self) { const gchar *subsys; const gchar *name; g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); subsys = g_udev_device_get_subsystem (self->priv->port); name = g_udev_device_get_name (self->priv->port); if (!g_str_has_prefix (subsys, "usb") || !name || !g_str_has_prefix (name, "cdc-wdm")) return FALSE; return self->priv->is_qmi; }
MMPortType mm_port_probe_get_port_type (MMPortProbe *self) { g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); if (g_str_equal (self->priv->subsys, "net")) return MM_PORT_TYPE_NET; if (self->priv->flags & MM_PORT_PROBE_QCDM && self->priv->is_qcdm) return MM_PORT_TYPE_QCDM; if (self->priv->flags & MM_PORT_PROBE_AT && self->priv->is_at) return MM_PORT_TYPE_AT; return MM_PORT_TYPE_UNKNOWN; }
const gchar * mm_port_probe_get_product (MMPortProbe *self) { const gchar *subsys; const gchar *name; g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); subsys = g_udev_device_get_subsystem (self->priv->port); name = g_udev_device_get_name (self->priv->port); if (g_str_equal (subsys, "net") || (g_str_has_prefix (subsys, "usb") && g_str_has_prefix (name, "cdc-wdm"))) return NULL; return (self->priv->flags & MM_PORT_PROBE_AT_PRODUCT ? self->priv->product : NULL); }
gboolean mm_port_probe_is_qcdm (MMPortProbe *self) { const gchar *subsys; const gchar *name; g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); subsys = g_udev_device_get_subsystem (self->priv->port); name = g_udev_device_get_name (self->priv->port); if (g_str_equal (subsys, "net") || (g_str_has_prefix (subsys, "usb") && g_str_has_prefix (name, "cdc-wdm"))) return FALSE; return (self->priv->flags & MM_PORT_PROBE_QCDM ? self->priv->is_qcdm : FALSE); }
gboolean mm_port_probe_run_finish (MMPortProbe *self, GAsyncResult *result, GError **error) { gboolean res; g_return_val_if_fail (MM_IS_PORT_PROBE (self), FALSE); g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); /* Propagate error, if any */ if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) res = FALSE; else res = g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (result)); /* Cleanup probing task */ if (self->priv->task) { port_probe_run_task_free (self->priv->task); self->priv->task = NULL; } return res; }
void mm_port_probe_run (MMPortProbe *self, MMPortProbeFlag flags, guint64 at_send_delay, const MMPortProbeAtCommand *at_custom_init, GAsyncReadyCallback callback, gpointer user_data) { PortProbeRunTask *task; guint32 i; gchar *probe_list_str; g_return_if_fail (MM_IS_PORT_PROBE (self)); g_return_if_fail (flags != MM_PORT_PROBE_NONE); g_return_if_fail (callback != NULL); /* Shouldn't schedule more than one probing at a time */ g_assert (self->priv->task == NULL); task = g_new0 (PortProbeRunTask, 1); task->at_send_delay = at_send_delay; task->flags = MM_PORT_PROBE_NONE; task->at_custom_init = at_custom_init; task->result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, mm_port_probe_run); /* Check if we already have the requested probing results. * We will fix here the 'task->flags' so that we only request probing * for the missing things. */ for (i = MM_PORT_PROBE_AT; i <= MM_PORT_PROBE_QCDM; i = (i << 1)) { if ((flags & i) && !(self->priv->flags & i)) { task->flags += i; } } /* Store as current task. We need to keep it internally, as it will be * freed during _finish() when the operation is completed. */ self->priv->task = task; /* All requested probings already available? If so, we're done */ if (!task->flags) { port_probe_run_task_complete (task, TRUE, NULL); return; } /* Setup internal cancellable */ task->cancellable = g_cancellable_new (); probe_list_str = mm_port_probe_flag_build_string_from_mask (task->flags); mm_info ("(%s) launching port probing: '%s'", self->priv->name, probe_list_str); g_free (probe_list_str); /* If any AT probing is needed, start by opening as AT port */ if (task->flags & MM_PORT_PROBE_AT || task->flags & MM_PORT_PROBE_AT_VENDOR || task->flags & MM_PORT_PROBE_AT_PRODUCT) { task->at_probing_cancellable = g_cancellable_new (); task->source_id = g_idle_add ((GSourceFunc)serial_open_at, self); return; } /* Otherwise, start by opening as QCDM port */ if (task->flags & MM_PORT_PROBE_QCDM) { task->source_id = g_idle_add ((GSourceFunc)serial_probe_qcdm, self); return; } /* Shouldn't happen */ g_assert_not_reached (); }