Mercurial > noffle
comparison src/client.c @ 130:d6c006a27ffe noffle
[svn] Add article fetching and fix potential lock bug
| author | bears |
|---|---|
| date | Wed, 09 Aug 2000 22:26:28 +0100 |
| parents | 3c71e28c8eef |
| children | 8b9366fc1361 |
comparison
equal
deleted
inserted
replaced
| 129:6b2b93288caa | 130:d6c006a27ffe |
|---|---|
| 1 /* | 1 /* |
| 2 client.c | 2 client.c |
| 3 | 3 |
| 4 $Id: client.c 183 2000-07-25 12:14:54Z bears $ | 4 $Id: client.c 191 2000-08-09 21:26:28Z bears $ |
| 5 */ | 5 */ |
| 6 | 6 |
| 7 #if HAVE_CONFIG_H | 7 #if HAVE_CONFIG_H |
| 8 #include <config.h> | 8 #include <config.h> |
| 9 #endif | 9 #endif |
| 21 #include <unistd.h> | 21 #include <unistd.h> |
| 22 #include "configfile.h" | 22 #include "configfile.h" |
| 23 #include "content.h" | 23 #include "content.h" |
| 24 #include "control.h" | 24 #include "control.h" |
| 25 #include "dynamicstring.h" | 25 #include "dynamicstring.h" |
| 26 #include "filter.h" | |
| 26 #include "group.h" | 27 #include "group.h" |
| 27 #include "itemlist.h" | 28 #include "itemlist.h" |
| 28 #include "lock.h" | 29 #include "lock.h" |
| 29 #include "log.h" | 30 #include "log.h" |
| 30 #include "over.h" | 31 #include "over.h" |
| 546 return FALSE; | 547 return FALSE; |
| 547 stat = getStat(); | 548 stat = getStat(); |
| 548 if ( pattern[ 0 ] != '\0' && stat != STAT_GRPS_FOLLOW ) | 549 if ( pattern[ 0 ] != '\0' && stat != STAT_GRPS_FOLLOW ) |
| 549 { | 550 { |
| 550 *noServerPattern = TRUE; | 551 *noServerPattern = TRUE; |
| 551 if ( ! putCmd( "LIST ACTIVE" ) ) | 552 if ( ! putCmd( "LIST" ) ) |
| 552 return FALSE; | 553 return FALSE; |
| 553 stat = getStat(); | 554 stat = getStat(); |
| 554 } | 555 } |
| 555 if ( stat != STAT_GRPS_FOLLOW ) | 556 if ( stat != STAT_GRPS_FOLLOW ) |
| 556 { | 557 { |
| 893 | 894 |
| 894 Bool | 895 Bool |
| 895 Client_getOver( const char *grp, int rmtFirst, int rmtLast, FetchMode mode ) | 896 Client_getOver( const char *grp, int rmtFirst, int rmtLast, FetchMode mode ) |
| 896 { | 897 { |
| 897 size_t nbytes, nlines; | 898 size_t nbytes, nlines; |
| 898 int rmtNumb, oldLast, cntMarked; | 899 int rmtNumb, groupsNumb, oldLast, cntMarked; |
| 899 Over *ov; | 900 Over *ov; |
| 900 Str line, subj, from, date, msgId, ref; | 901 Str line, subj, from, date, msgId, ref, groups; |
| 901 DynStr *response; | 902 DynStr *response, *newsgroups; |
| 902 const char *lines; | 903 const char *lines, *groupLines; |
| 904 char *p; | |
| 905 FilterAction action; | |
| 903 | 906 |
| 904 ASSERT( ! Lock_gotLock() ); | 907 ASSERT( ! Lock_gotLock() ); |
| 905 ASSERT( strcmp( grp, "" ) != 0 ); | 908 ASSERT( strcmp( grp, "" ) != 0 ); |
| 909 | |
| 910 /* Do we need the article Newsgroups: for filtering? */ | |
| 911 if ( Flt_getNewsgroups() ) | |
| 912 { | |
| 913 if ( ! putCmd( "XHDR Newsgroups %lu-%lu", rmtFirst, rmtLast ) ) | |
| 914 return FALSE; | |
| 915 if ( getStat() != STAT_HEAD_FOLLOWS ) | |
| 916 { | |
| 917 Log_err( "XHDR command failed: %s", client.lastStat ); | |
| 918 return FALSE; | |
| 919 } | |
| 920 | |
| 921 Log_dbg( "Requesting Newsgroups headers for remote %lu-%lu", | |
| 922 rmtFirst, rmtLast ); | |
| 923 | |
| 924 newsgroups = collectTxt(); | |
| 925 groupLines = DynStr_str( newsgroups ); | |
| 926 } | |
| 927 else | |
| 928 { | |
| 929 groupLines = NULL; | |
| 930 newsgroups = NULL; | |
| 931 } | |
| 932 | |
| 906 if ( ! putCmd( "XOVER %lu-%lu", rmtFirst, rmtLast ) ) | 933 if ( ! putCmd( "XOVER %lu-%lu", rmtFirst, rmtLast ) ) |
| 907 return FALSE; | 934 { |
| 935 del_DynStr( newsgroups ); | |
| 936 return FALSE; | |
| 937 } | |
| 938 | |
| 908 if ( getStat() != STAT_OVERS_FOLLOW ) | 939 if ( getStat() != STAT_OVERS_FOLLOW ) |
| 909 { | 940 { |
| 941 del_DynStr( newsgroups ); | |
| 910 Log_err( "XOVER command failed: %s", client.lastStat ); | 942 Log_err( "XOVER command failed: %s", client.lastStat ); |
| 911 return FALSE; | 943 return FALSE; |
| 912 } | 944 } |
| 913 Log_dbg( "Requesting overview for remote %lu-%lu", rmtFirst, rmtLast ); | 945 Log_dbg( "Requesting overview for remote %lu-%lu", rmtFirst, rmtLast ); |
| 914 | 946 |
| 915 response = collectTxt(); | 947 response = collectTxt(); |
| 916 if ( response == NULL ) | 948 if ( response == NULL ) |
| 949 { | |
| 950 del_DynStr( newsgroups ); | |
| 917 return FALSE; | 951 return FALSE; |
| 952 } | |
| 918 | 953 |
| 919 if ( ! Lock_openDatabases() ) | 954 if ( ! Lock_openDatabases() ) |
| 955 { | |
| 956 del_DynStr( newsgroups ); | |
| 957 del_DynStr( response ); | |
| 920 return FALSE; | 958 return FALSE; |
| 959 } | |
| 960 | |
| 921 Cont_read( grp ); | 961 Cont_read( grp ); |
| 922 oldLast = Cont_last(); | 962 oldLast = Cont_last(); |
| 923 cntMarked = 0; | 963 cntMarked = 0; |
| 924 lines = DynStr_str( response ); | 964 lines = DynStr_str( response ); |
| 925 while ( ( lines = Utl_getLn( line, lines) ) != NULL ) | 965 while ( ( lines = Utl_getLn( line, lines ) ) != NULL ) |
| 926 { | 966 { |
| 927 if ( ! parseOvLn( line, &rmtNumb, subj, from, date, msgId, ref, | 967 if ( ! parseOvLn( line, &rmtNumb, subj, from, date, msgId, ref, |
| 928 &nbytes, &nlines ) ) | 968 &nbytes, &nlines ) ) |
| 929 Log_err( "Bad overview line: %s", line ); | 969 Log_err( "Bad overview line: %s", line ); |
| 930 else if ( Cont_find( msgId ) >= 0 ) | 970 else if ( Cont_find( msgId ) >= 0 ) |
| 931 Log_inf( "Already have '%s'", msgId ); | 971 Log_inf( "Already have '%s'", msgId ); |
| 932 else | 972 else |
| 933 { | 973 { |
| 934 ov = new_Over( subj, from, date, msgId, ref, nbytes, nlines ); | 974 ov = new_Over( subj, from, date, msgId, ref, nbytes, nlines ); |
| 975 groupsNumb = 0; | |
| 976 p = NULL; | |
| 977 if ( groupLines != NULL ) | |
| 978 { | |
| 979 do | |
| 980 { | |
| 981 groupLines = Utl_getLn( groups, groupLines ); | |
| 982 groupsNumb = strtoul( groups, &p, 10 ); | |
| 983 } while ( groupLines != NULL | |
| 984 && p > groups | |
| 985 && groupsNumb < rmtNumb ); | |
| 986 if ( groupsNumb != rmtNumb ) | |
| 987 p = NULL; | |
| 988 } | |
| 989 | |
| 990 action = Flt_checkFilters( grp, p, ov, mode ); | |
| 991 if ( action == FILTER_DISCARD ) | |
| 992 continue; | |
| 935 Cont_app( ov ); | 993 Cont_app( ov ); |
| 936 prepareEntry( ov ); | 994 prepareEntry( ov ); |
| 937 if ( mode == FULL || ( mode == THREAD && needsMark( ref ) ) ) | 995 if ( action == FILTER_FULL |
| 996 || ( action == FILTER_THREAD && needsMark( ref ) ) ) | |
| 938 { | 997 { |
| 939 Req_add( client.serv, msgId ); | 998 Req_add( client.serv, msgId ); |
| 940 ++cntMarked; | 999 ++cntMarked; |
| 941 } | 1000 } |
| 942 } | 1001 } |
| 947 Log_inf( "%u articles marked for download in %s", cntMarked, client.grp ); | 1006 Log_inf( "%u articles marked for download in %s", cntMarked, client.grp ); |
| 948 Cont_write(); | 1007 Cont_write(); |
| 949 Grp_setFirstLast( grp, Cont_first(), Cont_last() ); | 1008 Grp_setFirstLast( grp, Cont_first(), Cont_last() ); |
| 950 Lock_closeDatabases(); | 1009 Lock_closeDatabases(); |
| 951 del_DynStr( response ); | 1010 del_DynStr( response ); |
| 1011 del_DynStr( newsgroups ); | |
| 952 return TRUE; | 1012 return TRUE; |
| 953 } | 1013 } |
| 954 | 1014 |
| 955 static void | 1015 static void |
| 956 retrievingFailed( const char* msgId, const char *reason ) | 1016 retrievingFailed( const char* msgId, const char *reason ) |
| 1085 Bool | 1145 Bool |
| 1086 Client_changeToGrp( const char* name ) | 1146 Client_changeToGrp( const char* name ) |
| 1087 { | 1147 { |
| 1088 unsigned int stat; | 1148 unsigned int stat; |
| 1089 int estimatedNumb, first, last; | 1149 int estimatedNumb, first, last; |
| 1150 Bool res; | |
| 1090 | 1151 |
| 1091 ASSERT( Lock_gotLock() ); | 1152 ASSERT( Lock_gotLock() ); |
| 1092 if ( ! Grp_exists( name ) ) | 1153 if ( ! Grp_exists( name ) ) |
| 1093 return FALSE; | 1154 return FALSE; |
| 1094 if ( ! putCmd( "GROUP %s", name ) ) | 1155 Lock_closeDatabases(); |
| 1095 return FALSE; | 1156 res = putCmd( "GROUP %s", name ); |
| 1096 if ( getStat() != STAT_GRP_SELECTED ) | 1157 res = res && ( getStat() == STAT_GRP_SELECTED ); |
| 1158 if ( ! Lock_openDatabases() || ! res ) | |
| 1097 return FALSE; | 1159 return FALSE; |
| 1098 if ( sscanf( client.lastStat, "%u %d %d %d", | 1160 if ( sscanf( client.lastStat, "%u %d %d %d", |
| 1099 &stat, &estimatedNumb, &first, &last ) != 4 ) | 1161 &stat, &estimatedNumb, &first, &last ) != 4 ) |
| 1100 { | 1162 { |
| 1101 Log_err( "Bad server response to GROUP: %s", client.lastStat ); | 1163 Log_err( "Bad server response to GROUP: %s", client.lastStat ); |
