| 1567 |
1570 |
| 1568 return cert_label; |
1571 return cert_label; |
| 1569 #endif |
1572 #endif |
| 1570 } |
1573 } |
| 1571 |
1574 |
| |
1575 static GdkPixbuf* |
| |
1576 _pidgin_datasheet_stock_icon_get(const gchar *stock_name) |
| |
1577 { |
| |
1578 GdkPixbuf *image = NULL; |
| |
1579 gchar *domain, *id; |
| |
1580 |
| |
1581 if (stock_name == NULL) |
| |
1582 return NULL; |
| |
1583 |
| |
1584 /* core is quitting */ |
| |
1585 if (datasheet_stock == NULL) |
| |
1586 return NULL; |
| |
1587 |
| |
1588 if (g_hash_table_lookup_extended(datasheet_stock, stock_name, |
| |
1589 NULL, (gpointer*)&image)) |
| |
1590 { |
| |
1591 return image; |
| |
1592 } |
| |
1593 |
| |
1594 domain = g_strdup(stock_name); |
| |
1595 id = strchr(domain, '/'); |
| |
1596 if (!id) { |
| |
1597 g_free(domain); |
| |
1598 return NULL; |
| |
1599 } |
| |
1600 id[0] = '\0'; |
| |
1601 id++; |
| |
1602 |
| |
1603 if (g_strcmp0(domain, "prpl") == 0) { |
| |
1604 PurpleAccount *account; |
| |
1605 gchar *prpl, *accountname; |
| |
1606 |
| |
1607 prpl = id; |
| |
1608 accountname = strchr(id, ':'); |
| |
1609 |
| |
1610 if (!accountname) { |
| |
1611 g_free(domain); |
| |
1612 return NULL; |
| |
1613 } |
| |
1614 |
| |
1615 accountname[0] = '\0'; |
| |
1616 accountname++; |
| |
1617 |
| |
1618 account = purple_accounts_find(accountname, prpl); |
| |
1619 if (account) { |
| |
1620 image = pidgin_create_prpl_icon(account, |
| |
1621 PIDGIN_PRPL_ICON_SMALL); |
| |
1622 } |
| |
1623 } else if (g_strcmp0(domain, "e2ee") == 0) { |
| |
1624 image = pidgin_pixbuf_from_imgstore( |
| |
1625 _pidgin_e2ee_stock_icon_get(id)); |
| |
1626 } else { |
| |
1627 purple_debug_error("gtkrequest", "Unknown domain: %s", domain); |
| |
1628 g_free(domain); |
| |
1629 return NULL; |
| |
1630 } |
| |
1631 |
| |
1632 g_hash_table_insert(datasheet_stock, g_strdup(stock_name), image); |
| |
1633 return image; |
| |
1634 } |
| |
1635 |
| |
1636 static void |
| |
1637 datasheet_update_rec(PurpleRequestDatasheetRecord *rec, GtkListStore *model, |
| |
1638 GtkTreeIter *iter) |
| |
1639 { |
| |
1640 guint i, col_count; |
| |
1641 PurpleRequestDatasheet *sheet; |
| |
1642 |
| |
1643 g_return_if_fail(rec != NULL); |
| |
1644 g_return_if_fail(model != NULL); |
| |
1645 g_return_if_fail(iter != NULL); |
| |
1646 |
| |
1647 sheet = purple_request_datasheet_record_get_datasheet(rec); |
| |
1648 |
| |
1649 g_return_if_fail(sheet != NULL); |
| |
1650 |
| |
1651 col_count = purple_request_datasheet_get_column_count(sheet); |
| |
1652 |
| |
1653 for (i = 0; i < col_count; i++) { |
| |
1654 PurpleRequestDatasheetColumnType type; |
| |
1655 |
| |
1656 type = purple_request_datasheet_get_column_type( |
| |
1657 sheet, i); |
| |
1658 if (type == PURPLE_REQUEST_DATASHEET_COLUMN_STRING) { |
| |
1659 GValue val; |
| |
1660 |
| |
1661 val.g_type = 0; |
| |
1662 g_value_init(&val, G_TYPE_STRING); |
| |
1663 g_value_set_string(&val, |
| |
1664 purple_request_datasheet_record_get_string_data( |
| |
1665 rec, i)); |
| |
1666 gtk_list_store_set_value(model, iter, |
| |
1667 i + 1, &val); |
| |
1668 } else if (type == |
| |
1669 PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE) |
| |
1670 { |
| |
1671 GdkPixbuf *pixbuf; |
| |
1672 |
| |
1673 pixbuf = _pidgin_datasheet_stock_icon_get( |
| |
1674 purple_request_datasheet_record_get_image_data( |
| |
1675 rec, i)); |
| |
1676 gtk_list_store_set(model, iter, i + 1, |
| |
1677 pixbuf, -1); |
| |
1678 } else |
| |
1679 g_warn_if_reached(); |
| |
1680 } |
| |
1681 } |
| |
1682 |
| |
1683 static void |
| |
1684 datasheet_fill(PurpleRequestDatasheet *sheet, GtkListStore *model) |
| |
1685 { |
| |
1686 const GList *it; |
| |
1687 |
| |
1688 gtk_list_store_clear(model); |
| |
1689 |
| |
1690 it = purple_request_datasheet_get_records(sheet); |
| |
1691 for (; it != NULL; it = g_list_next(it)) { |
| |
1692 PurpleRequestDatasheetRecord *rec = it->data; |
| |
1693 GtkTreeIter iter; |
| |
1694 |
| |
1695 gtk_list_store_append(model, &iter); |
| |
1696 gtk_list_store_set(model, &iter, 0, |
| |
1697 purple_request_datasheet_record_get_key(rec), -1); |
| |
1698 |
| |
1699 datasheet_update_rec(rec, model, &iter); |
| |
1700 } |
| |
1701 } |
| |
1702 |
| |
1703 static void |
| |
1704 datasheet_update(PurpleRequestDatasheet *sheet, gpointer key, |
| |
1705 GtkListStore *model) |
| |
1706 { |
| |
1707 PurpleRequestDatasheetRecord *rec; |
| |
1708 GtkTreeIter iter; |
| |
1709 GtkTreeModel *tmodel = GTK_TREE_MODEL(model); |
| |
1710 gboolean found = FALSE; |
| |
1711 |
| |
1712 g_return_if_fail(tmodel != NULL); |
| |
1713 |
| |
1714 if (key == NULL) { |
| |
1715 datasheet_fill(sheet, model); |
| |
1716 return; |
| |
1717 } |
| |
1718 |
| |
1719 rec = purple_request_datasheet_record_find(sheet, key); |
| |
1720 |
| |
1721 if (gtk_tree_model_get_iter_first(tmodel, &iter)) { |
| |
1722 do { |
| |
1723 gpointer ikey; |
| |
1724 |
| |
1725 gtk_tree_model_get(tmodel, &iter, 0, &ikey, -1); |
| |
1726 |
| |
1727 if (key == ikey) { |
| |
1728 found = TRUE; |
| |
1729 break; |
| |
1730 } |
| |
1731 } while (gtk_tree_model_iter_next(tmodel, &iter)); |
| |
1732 } |
| |
1733 |
| |
1734 if (rec == NULL && !found) { |
| |
1735 return; |
| |
1736 } |
| |
1737 |
| |
1738 if (rec == NULL) { |
| |
1739 gtk_list_store_remove(model, &iter); |
| |
1740 return; |
| |
1741 } |
| |
1742 |
| |
1743 if (!found) { |
| |
1744 gtk_list_store_append(model, &iter); |
| |
1745 gtk_list_store_set(model, &iter, 0, key, -1); |
| |
1746 } |
| |
1747 |
| |
1748 datasheet_update_rec(rec, model, &iter); |
| |
1749 } |
| |
1750 |
| |
1751 static GtkWidget * |
| |
1752 create_datasheet_field(PurpleRequestField *field) |
| |
1753 { |
| |
1754 PurpleRequestDatasheet *sheet; |
| |
1755 guint i, col_count; |
| |
1756 GType *col_types; |
| |
1757 GtkListStore *model; |
| |
1758 GtkTreeView *view; |
| |
1759 GtkWidget *scrollable; |
| |
1760 GtkCellRenderer *renderer_image = NULL, *renderer_text = NULL; |
| |
1761 GtkTreeViewColumn *id_column; |
| |
1762 |
| |
1763 sheet = purple_request_field_datasheet_get_sheet(field); |
| |
1764 |
| |
1765 col_count = purple_request_datasheet_get_column_count(sheet); |
| |
1766 |
| |
1767 col_types = g_new0(GType, col_count + 1); |
| |
1768 col_types[0] = G_TYPE_POINTER; |
| |
1769 for (i = 0; i < col_count; i++) { |
| |
1770 PurpleRequestDatasheetColumnType type; |
| |
1771 type = purple_request_datasheet_get_column_type(sheet, i); |
| |
1772 if (type == PURPLE_REQUEST_DATASHEET_COLUMN_STRING) |
| |
1773 col_types[i + 1] = G_TYPE_STRING; |
| |
1774 else if (type == PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE) |
| |
1775 col_types[i + 1] = GDK_TYPE_PIXBUF; |
| |
1776 else |
| |
1777 g_warn_if_reached(); |
| |
1778 } |
| |
1779 model = gtk_list_store_newv(col_count + 1, col_types); |
| |
1780 g_free(col_types); |
| |
1781 |
| |
1782 view = GTK_TREE_VIEW(gtk_tree_view_new_with_model( |
| |
1783 GTK_TREE_MODEL(model))); |
| |
1784 g_object_unref(G_OBJECT(model)); |
| |
1785 |
| |
1786 id_column = gtk_tree_view_column_new(); |
| |
1787 gtk_tree_view_column_set_visible(id_column, FALSE); |
| |
1788 gtk_tree_view_append_column(view, id_column); |
| |
1789 |
| |
1790 for (i = 0; i < col_count; i++) { |
| |
1791 PurpleRequestDatasheetColumnType type; |
| |
1792 const gchar *title; |
| |
1793 GtkCellRenderer *renderer; |
| |
1794 const gchar *type_str = ""; |
| |
1795 |
| |
1796 type = purple_request_datasheet_get_column_type(sheet, i); |
| |
1797 title = purple_request_datasheet_get_column_title(sheet, i); |
| |
1798 |
| |
1799 if (type == PURPLE_REQUEST_DATASHEET_COLUMN_STRING) { |
| |
1800 type_str = "text"; |
| |
1801 if (!renderer_text) |
| |
1802 renderer_text = gtk_cell_renderer_text_new(); |
| |
1803 renderer = renderer_text; |
| |
1804 } |
| |
1805 else if (type == PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE) { |
| |
1806 type_str = "pixbuf"; |
| |
1807 if (!renderer_image) |
| |
1808 renderer_image = gtk_cell_renderer_pixbuf_new(); |
| |
1809 renderer = renderer_image; |
| |
1810 } else |
| |
1811 g_warn_if_reached(); |
| |
1812 |
| |
1813 if (title == NULL) |
| |
1814 title = ""; |
| |
1815 gtk_tree_view_insert_column_with_attributes( |
| |
1816 view, -1, title, renderer, type_str, |
| |
1817 i + 1, NULL); |
| |
1818 } |
| |
1819 |
| |
1820 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE); |
| |
1821 |
| |
1822 datasheet_fill(sheet, model); |
| |
1823 purple_signal_connect(sheet, "record-changed", |
| |
1824 pidgin_request_get_handle(), |
| |
1825 PURPLE_CALLBACK(datasheet_update), model); |
| |
1826 |
| |
1827 gtk_widget_set_size_request(GTK_WIDGET(view), 400, 250); |
| |
1828 |
| |
1829 scrollable = pidgin_make_scrollable(GTK_WIDGET(view), |
| |
1830 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1); |
| |
1831 gtk_widget_show(GTK_WIDGET(view)); |
| |
1832 return scrollable; |
| |
1833 } |
| |
1834 |
| 1572 static void * |
1835 static void * |
| 1573 pidgin_request_fields(const char *title, const char *primary, |
1836 pidgin_request_fields(const char *title, const char *primary, |
| 1574 const char *secondary, PurpleRequestFields *fields, const char *ok_text, |
1837 const char *secondary, PurpleRequestFields *fields, const char *ok_text, |
| 1575 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, |
1838 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, |
| 1576 PurpleRequestCommonParameters *cpar, void *user_data) |
1839 PurpleRequestCommonParameters *cpar, void *user_data) |