comparison libpurple/plugins/log_reader.c @ 18247:97671eb4991e

Avoid some extra nesting.
author Richard Laager <rlaager@wiktel.com>
date Sun, 24 Jun 2007 23:37:53 +0000
parents e236b3bd4542
children ab761acbc614
comparison
equal deleted inserted replaced
18246:e236b3bd4542 18247:97671eb4991e
1749 { 1749 {
1750 GList *list = NULL; 1750 GList *list = NULL;
1751 const char *logdir; 1751 const char *logdir;
1752 PurplePlugin *plugin; 1752 PurplePlugin *plugin;
1753 PurplePluginProtocolInfo *prpl_info; 1753 PurplePluginProtocolInfo *prpl_info;
1754 const char *buddy_name;
1755 char *username; 1754 char *username;
1756 char *filename; 1755 char *filename;
1757 char *path; 1756 char *path;
1758 gsize length; 1757 gsize length;
1759 GError *error = NULL; 1758 GError *error = NULL;
1760 gchar *contents = NULL; 1759 char *contents = NULL;
1760 struct qip_logger_data *data = NULL;
1761 char *utf8_string = NULL;
1762 struct tm prev_tm;
1763 gboolean prev_tm_init = FALSE;
1764 char *c;
1765 char *start_log;
1766 char *escaped;
1767 int offset = 0;
1761 1768
1762 g_return_val_if_fail(sn != NULL, list); 1769 g_return_val_if_fail(sn != NULL, list);
1763 g_return_val_if_fail(account != NULL, list); 1770 g_return_val_if_fail(account != NULL, list);
1764 1771
1765 /* QIP is ICQ messenger. Should we add prpl-aim? */ 1772 /* QIP only supports ICQ. */
1766 if (strcmp(account->protocol_id, "prpl-icq")) 1773 if (strcmp(account->protocol_id, "prpl-icq"))
1767 return list; 1774 return list;
1768 1775
1769 logdir = purple_prefs_get_string("/plugins/core/log_reader/qip/log_directory"); 1776 logdir = purple_prefs_get_string("/plugins/core/log_reader/qip/log_directory");
1770 1777
1778 1785
1779 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); 1786 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin);
1780 if (!prpl_info->list_icon) 1787 if (!prpl_info->list_icon)
1781 return NULL; 1788 return NULL;
1782 1789
1783 buddy_name = g_strdup(purple_normalize(account, sn));
1784
1785 username = g_strdup(purple_normalize(account, account->username)); 1790 username = g_strdup(purple_normalize(account, account->username));
1786 1791 filename = g_strdup_printf("%s.txt", purple_normalize(account, sn));
1787 filename = g_strdup_printf("%s.txt", buddy_name); 1792 path = g_build_filename(logdir, username, "History", filename, NULL);
1788 path = g_build_filename( 1793 g_free(username);
1789 logdir, username, "History", filename, NULL); 1794 g_free(filename);
1790 1795
1791 purple_debug_info("QIP logger list", "Reading %s\n", path); 1796 purple_debug_info("QIP logger list", "Reading %s\n", path);
1792 1797
1793 error = NULL; 1798 error = NULL;
1794 if (!g_file_get_contents(path, &contents, &length, &error)) { 1799 if (!g_file_get_contents(path, &contents, &length, &error)) {
1795 if (error) { 1800 purple_debug_error("QIP logger list",
1796 purple_debug_error("QIP logger list", 1801 "Couldn't read file %s: %s \n", path, error->message);
1797 "Couldn't read file %s \n", path); 1802 g_error_free(error);
1798 1803
1799 g_error_free(error); 1804 g_free(path);
1800 } 1805 return list;
1801 } else if (contents) { 1806 }
1802 struct qip_logger_data *data = NULL; 1807
1803 gchar * utf8_string = NULL; 1808 g_return_val_if_fail(contents != NULL, list);
1804 1809
1805 purple_debug_info("QIP logger list", "File %s is found\n", filename); 1810 purple_debug_info("QIP logger list", "File %s is found\n", path);
1811
1812 /* Convert file contents from Cp1251 to UTF-8 codeset */
1813 error = NULL;
1814 if (!(utf8_string = g_convert(contents, length, "UTF-8", "Cp1251", NULL, NULL, &error))) {
1815 purple_debug_error("QIP logger list",
1816 "Couldn't convert file %s to UTF-8: %s\n", path, error->message);
1817 g_error_free(error);
1818
1819 g_free(path);
1820 g_free(contents);
1821 return list;
1822 }
1823
1824 g_free(contents);
1825 contents = g_markup_escape_text(utf8_string, -1);
1826 g_free(utf8_string);
1827
1828 c = contents;
1829 start_log = contents;
1830 while (*c) {
1831 if (purple_str_has_prefix(c, QIP_LOG_IN_MESSAGE_ESC) ||
1832 purple_str_has_prefix(c, QIP_LOG_OUT_MESSAGE_ESC)) {
1833
1834 gchar *new_line = c;
1806 1835
1807 /* We should convert file contents from Cp1251 to UTF-8 codeset */ 1836 /* find EOL */
1808 error = NULL; 1837 c = strstr(c, "\n");
1809 if (!(utf8_string = g_convert(contents, length, "UTF-8", "Cp1251", NULL, NULL, &error))) { 1838 c++;
1810 if (error) { 1839
1811 purple_debug_error("QIP logger list", 1840 /* Find the last '(' character. */
1812 "Couldn't convert file %s to UTF-8\n", filename); 1841 if ((tmp = strstr(c, "\n")) != NULL)
1813 g_error_free(error); 1842 c = g_strrstr(tmp, "(");
1843 else {
1844 while (*c)
1845 c++;
1846 c--;
1847 c = g_strrstr(c, "(");
1814 } 1848 }
1815 } else { 1849
1816 struct tm prev_tm; 1850 if (c != NULL) {
1817 gboolean prev_tm_init = FALSE; 1851 const char *timestamp = ++c;
1818 gchar *c; 1852 struct tm tm;
1819 gchar *start_log; 1853
1820 gchar *escaped; 1854 /* Parse the time, day, month and year */
1821 int offset = 0; 1855 if (sscanf(timestamp, "%u:%u:%u %u/%u/%u",
1822 1856 &tm.tm_hour, &tm.tm_min, &tm.tm_sec,
1823 purple_debug_info("QIP logger list", 1857 &tm.tm_mday, &tm.tm_mon, &tm.tm_year) != 6) {
1824 "File %s converted successfully\n", filename); 1858
1825 1859 purple_debug_error("QIP logger list",
1826 g_free(contents); 1860 "Parsing timestamp error\n");
1827 escaped = g_markup_escape_text(utf8_string, -1); 1861 } else {
1828 contents = escaped; 1862 tm.tm_mon -= 1;
1829 1863 tm.tm_year -= 1900;
1830 c = contents; 1864
1831 start_log = contents; 1865 /* Let the C library deal with
1832 while (*c) { 1866 * daylight savings time. */
1833 if (purple_str_has_prefix(c, QIP_LOG_IN_MESSAGE_ESC) || 1867 tm.tm_isdst = -1;
1834 purple_str_has_prefix(c, QIP_LOG_OUT_MESSAGE_ESC)) { 1868
1835 gchar *new_line = c; 1869 if (!prev_tm_init) {
1836 1870 prev_tm = tm;
1837 purple_debug_info("QIP logger list", 1871 prev_tm_init = TRUE;
1838 "Find message\n", filename); 1872 } else {
1839 1873 double time_diff = difftime(mktime(&tm), mktime(&prev_tm));
1840 /* find EOL */ 1874
1841 c = strstr(c, "\n"); 1875 if (time_diff > QIP_LOG_TIMEOUT) {
1842 c++; 1876 PurpleLog *log;
1843 /* searching '(' character from the end of the line */
1844 c = strstr(c, "\n");
1845 while (*c && *c != '(')
1846 --c;
1847
1848 if (*c == '(') {
1849 const char *timestamp = ++c;
1850 struct tm tm;
1851 purple_debug_info("QIP logger list", "Timestap found\n");
1852
1853 /* Parse the time, day, month and year */
1854 if (sscanf(timestamp, "%u:%u:%u %u/%u/%u",
1855 &tm.tm_hour, &tm.tm_min, &tm.tm_sec,
1856 &tm.tm_mday, &tm.tm_mon, &tm.tm_year) != 6) {
1857 purple_debug_error("QIP logger list",
1858 "Parsing timestamp error\n");
1859 } else {
1860 /* cos month of year in [0,11] */
1861 tm.tm_mon -= 1;
1862 /* cos years since 1900 */
1863 tm.tm_year -= 1900;
1864
1865 /* Let the C library deal with
1866 * daylight savings time. */
1867 tm.tm_isdst = -1;
1868
1869 if (!prev_tm_init) {
1870 prev_tm = tm;
1871 prev_tm_init = TRUE;
1872
1873 } else {
1874 double time_diff = 0;
1875
1876 time_diff = difftime(mktime(&tm), mktime(&prev_tm));
1877
1878 if (time_diff > QIP_LOG_TIMEOUT) {
1879 PurpleLog *log;
1880
1881 /* filling data */
1882 data = g_new0(
1883 struct qip_logger_data, 1);
1884 data->path = g_strdup(path);
1885 data->length = new_line - start_log;
1886 data->offset = offset;
1887 offset += data->length;
1888
1889 purple_debug_error("QIP logger list",
1890 "Creating log: path = (%s); length = (%d); offset = (%d)\n", data->path, data->length, data->offset);
1891
1892 /* XXX: Look into this later... Should we pass in a struct tm? */
1893 log = purple_log_new(PURPLE_LOG_IM,
1894 sn, account, NULL, mktime(&prev_tm), NULL);
1895
1896 log->logger = qip_logger;
1897 log->logger_data = data;
1898
1899 list = g_list_append(list, log);
1900
1901 prev_tm = tm;
1902 start_log = new_line;
1903 }
1904 }
1905 1877
1906 /* find EOF */ 1878 /* filling data */
1907 c = strstr(c, "\n"); 1879 data = g_new0(struct qip_logger_data, 1);
1908 c++; 1880 data->path = g_strdup(path);
1881 data->length = new_line - start_log;
1882 data->offset = offset;
1883 offset += data->length;
1884
1885 purple_debug_error("QIP logger list",
1886 "Creating log: path = (%s); length = (%d); offset = (%d)\n", data->path, data->length, data->offset);
1887
1888 /* XXX: Look into this later... Should we pass in a struct tm? */
1889 log = purple_log_new(PURPLE_LOG_IM, sn, account,
1890 NULL, mktime(&prev_tm), NULL);
1891
1892 log->logger = qip_logger;
1893 log->logger_data = data;
1894
1895 list = g_list_append(list, log);
1896
1897 prev_tm = tm;
1898 start_log = new_line;
1909 } 1899 }
1910 } 1900 }
1911 } else { 1901
1902 /* find EOF */
1912 c = strstr(c, "\n"); 1903 c = strstr(c, "\n");
1913 c++; 1904 c++;
1914 } 1905 }
1915 } 1906 }
1916 1907 } else {
1917 /* adding last log */ 1908 c = strstr(c, "\n");
1918 if (prev_tm_init) { 1909 c++;
1919 PurpleLog *log; 1910 }
1920 1911 }
1921 /* filling data */ 1912
1922 data = g_new0( 1913 /* adding last log */
1923 struct qip_logger_data, 1); 1914 if (prev_tm_init) {
1924 data->path = g_strdup(path); 1915 PurpleLog *log;
1925 data->length = c - start_log; 1916
1926 data->offset = offset; 1917 /* filling data */
1927 offset += data->length; 1918 data = g_new0(
1928 purple_debug_error("QIP logger list", 1919 struct qip_logger_data, 1);
1929 "Creating log: path = (%s); length = (%d); offset = (%d)\n", data->path, data->length, data->offset); 1920 data->path = g_strdup(path);
1930 1921 data->length = c - start_log;
1931 /* XXX: Look into this later... Should we pass in a struct tm? */ 1922 data->offset = offset;
1932 log = purple_log_new(PURPLE_LOG_IM, sn, account, 1923 offset += data->length;
1933 NULL, mktime(&prev_tm), NULL); 1924 purple_debug_error("QIP logger list",
1934 1925 "Creating log: path = (%s); length = (%d); offset = (%d)\n", data->path, data->length, data->offset);
1935 log->logger = qip_logger; 1926
1936 log->logger_data = data; 1927 /* XXX: Look into this later... Should we pass in a struct tm? */
1937 1928 log = purple_log_new(PURPLE_LOG_IM, sn, account,
1938 list = g_list_append(list, log); 1929 NULL, mktime(&prev_tm), NULL);
1939 } 1930
1940 } 1931 log->logger = qip_logger;
1941 g_free(contents); 1932 log->logger_data = data;
1942 } 1933
1943 1934 list = g_list_append(list, log);
1944 g_free(username); 1935 }
1936
1937 g_free(contents);
1945 g_free(path); 1938 g_free(path);
1946 g_free(filename);
1947
1948 return list; 1939 return list;
1949 } 1940 }
1950 1941
1951 static char * qip_logger_read (PurpleLog *log, PurpleLogReadFlags *flags) 1942 static char * qip_logger_read (PurpleLog *log, PurpleLogReadFlags *flags)
1952 { 1943 {