Mercurial > pidgin
comparison libpurple/plugins/log_reader.c @ 18255:507fb436d8c0
optimization: finding offsets without converting to UTF8 and escaping
| author | Michael Shkutkov <mshkutkov@soc.pidgin.im> |
|---|---|
| date | Tue, 26 Jun 2007 11:11:40 +0000 |
| parents | 991f33e9e1a4 |
| children | 54251fa6389d |
comparison
equal
deleted
inserted
replaced
| 18254:991f33e9e1a4 | 18255:507fb436d8c0 |
|---|---|
| 1739 char *path; /* FIXME: Change this to use PurpleStringref like log.c:old_logger_list */ | 1739 char *path; /* FIXME: Change this to use PurpleStringref like log.c:old_logger_list */ |
| 1740 int offset; | 1740 int offset; |
| 1741 int length; | 1741 int length; |
| 1742 }; | 1742 }; |
| 1743 | 1743 |
| 1744 static char *qip_get_file_contents(const char *path) | |
| 1745 { | |
| 1746 GError *error; | |
| 1747 char *contents; | |
| 1748 char *utf8_string; | |
| 1749 | |
| 1750 purple_debug_info("QIP logger", "Reading %s\n", path); | |
| 1751 | |
| 1752 error = NULL; | |
| 1753 if (!g_file_get_contents(path, &contents, NULL, &error)) { | |
| 1754 purple_debug_error("QIP logger", | |
| 1755 "Couldn't read file %s: %s \n", path, error->message); | |
| 1756 g_error_free(error); | |
| 1757 return NULL; | |
| 1758 } | |
| 1759 | |
| 1760 g_return_val_if_fail(contents != NULL, NULL); | |
| 1761 | |
| 1762 /* Convert file contents from Cp1251 to UTF-8 codeset */ | |
| 1763 error = NULL; | |
| 1764 if (!(utf8_string = g_convert(contents, -1, "UTF-8", "Cp1251", NULL, NULL, &error))) { | |
| 1765 purple_debug_error("QIP logger", | |
| 1766 "Couldn't convert file %s to UTF-8: %s\n", path, error->message); | |
| 1767 g_error_free(error); | |
| 1768 | |
| 1769 g_free(contents); | |
| 1770 return NULL; | |
| 1771 } | |
| 1772 | |
| 1773 g_free(contents); | |
| 1774 contents = g_markup_escape_text(utf8_string, -1); | |
| 1775 g_free(utf8_string); | |
| 1776 | |
| 1777 return contents; | |
| 1778 } | |
| 1779 | |
| 1780 static GList *qip_logger_list(PurpleLogType type, const char *sn, PurpleAccount *account) | 1744 static GList *qip_logger_list(PurpleLogType type, const char *sn, PurpleAccount *account) |
| 1781 { | 1745 { |
| 1782 GList *list = NULL; | 1746 GList *list = NULL; |
| 1783 const char *logdir; | 1747 const char *logdir; |
| 1784 PurplePlugin *plugin; | 1748 PurplePlugin *plugin; |
| 1794 gboolean main_cycle = TRUE; | 1758 gboolean main_cycle = TRUE; |
| 1795 char *c; | 1759 char *c; |
| 1796 char *start_log; | 1760 char *start_log; |
| 1797 char *new_line; | 1761 char *new_line; |
| 1798 int offset = 0; | 1762 int offset = 0; |
| 1763 GError *error; | |
| 1799 | 1764 |
| 1800 g_return_val_if_fail(sn != NULL, list); | 1765 g_return_val_if_fail(sn != NULL, list); |
| 1801 g_return_val_if_fail(account != NULL, list); | 1766 g_return_val_if_fail(account != NULL, list); |
| 1802 | 1767 |
| 1803 /* QIP only supports ICQ. */ | 1768 /* QIP only supports ICQ. */ |
| 1822 filename = g_strdup_printf("%s.txt", purple_normalize(account, sn)); | 1787 filename = g_strdup_printf("%s.txt", purple_normalize(account, sn)); |
| 1823 path = g_build_filename(logdir, username, "History", filename, NULL); | 1788 path = g_build_filename(logdir, username, "History", filename, NULL); |
| 1824 g_free(username); | 1789 g_free(username); |
| 1825 g_free(filename); | 1790 g_free(filename); |
| 1826 | 1791 |
| 1827 if ((contents = qip_get_file_contents(path)) == NULL) | 1792 purple_debug_info("QIP logger", "Reading %s\n", path); |
| 1828 { | 1793 |
| 1794 error = NULL; | |
| 1795 if (!g_file_get_contents(path, &contents, NULL, &error)) { | |
| 1796 purple_debug_error("QIP logger", | |
| 1797 "Couldn't read file %s: %s \n", path, error->message); | |
| 1798 g_error_free(error); | |
| 1829 g_free(path); | 1799 g_free(path); |
| 1830 return list; | 1800 return list; |
| 1831 } | 1801 } |
| 1832 | 1802 |
| 1833 c = contents; | 1803 c = contents; |
| 1835 while (main_cycle) { | 1805 while (main_cycle) { |
| 1836 | 1806 |
| 1837 gboolean add_new_log = FALSE; | 1807 gboolean add_new_log = FALSE; |
| 1838 | 1808 |
| 1839 if (*c) { | 1809 if (*c) { |
| 1840 if (purple_str_has_prefix(c, QIP_LOG_IN_MESSAGE_ESC) || | 1810 if (purple_str_has_prefix(c, QIP_LOG_IN_MESSAGE) || |
| 1841 purple_str_has_prefix(c, QIP_LOG_OUT_MESSAGE_ESC)) { | 1811 purple_str_has_prefix(c, QIP_LOG_OUT_MESSAGE)) { |
| 1842 | 1812 |
| 1843 char *tmp; | 1813 char *tmp; |
| 1844 | 1814 |
| 1845 new_line = c; | 1815 new_line = c; |
| 1846 | 1816 |
| 1938 GString *formatted; | 1908 GString *formatted; |
| 1939 char *c; | 1909 char *c; |
| 1940 const char *line; | 1910 const char *line; |
| 1941 gchar *contents; | 1911 gchar *contents; |
| 1942 char *selected; | 1912 char *selected; |
| 1913 GError *error; | |
| 1914 char *utf8_string; | |
| 1943 | 1915 |
| 1944 g_return_val_if_fail(log != NULL, g_strdup("")); | 1916 g_return_val_if_fail(log != NULL, g_strdup("")); |
| 1945 | 1917 |
| 1946 data = log->logger_data; | 1918 data = log->logger_data; |
| 1947 | 1919 |
| 1948 g_return_val_if_fail(data->path != NULL, g_strdup("")); | 1920 g_return_val_if_fail(data->path != NULL, g_strdup("")); |
| 1949 g_return_val_if_fail(data->length > 0, g_strdup("")); | 1921 g_return_val_if_fail(data->length > 0, g_strdup("")); |
| 1950 | 1922 |
| 1951 if ((contents = qip_get_file_contents(data->path)) == NULL) | 1923 error = NULL; |
| 1952 { | 1924 if (!g_file_get_contents(data->path, &contents, NULL, &error)) { |
| 1925 purple_debug_error("QIP logger", | |
| 1926 "Couldn't read file %s: %s \n", data->path, error->message); | |
| 1927 g_error_free(error); | |
| 1953 return g_strdup(""); | 1928 return g_strdup(""); |
| 1954 } | 1929 } |
| 1955 | |
| 1956 buddy = purple_find_buddy(log->account, log->name); | |
| 1957 | 1930 |
| 1958 selected = g_strndup(contents + data->offset, data->length + 2); | 1931 selected = g_strndup(contents + data->offset, data->length + 2); |
| 1959 selected[data->length] = '\n'; | 1932 selected[data->length] = '\n'; |
| 1960 selected[data->length + 1] = '\0'; | 1933 selected[data->length + 1] = '\0'; |
| 1961 | |
| 1962 g_free(contents); | 1934 g_free(contents); |
| 1963 contents = selected; | 1935 contents = selected; |
| 1936 | |
| 1937 /* Convert file contents from Cp1251 to UTF-8 codeset */ | |
| 1938 error = NULL; | |
| 1939 if (!(utf8_string = g_convert(contents, -1, "UTF-8", "Cp1251", NULL, NULL, &error))) { | |
| 1940 purple_debug_error("QIP logger", | |
| 1941 "Couldn't convert file %s to UTF-8: %s\n", data->path, error->message); | |
| 1942 g_error_free(error); | |
| 1943 g_free(contents); | |
| 1944 return g_strdup(""); | |
| 1945 } | |
| 1946 | |
| 1947 g_free(contents); | |
| 1948 contents = g_markup_escape_text(utf8_string, -1); | |
| 1949 g_free(utf8_string); | |
| 1950 | |
| 1951 buddy = purple_find_buddy(log->account, log->name); | |
| 1964 | 1952 |
| 1965 /* Apply formatting... */ | 1953 /* Apply formatting... */ |
| 1966 formatted = g_string_sized_new(data->length + 2); | 1954 formatted = g_string_sized_new(data->length + 2); |
| 1967 c = contents; | 1955 c = contents; |
| 1968 line = contents; | 1956 line = contents; |
