objects.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <stdlib.h>
00011 #include <string.h>
00012 #include <sys/types.h>
00013
00014 #ifdef _MSC_VER
00015 #include <winsock.h>
00016 #else
00017 #include <sys/socket.h>
00018 #include <netdb.h>
00019 #endif
00020
00021 #include "libspopc.h"
00022
00023
00024
00025
00026
00027 char* popbegin(const char* servername, const char* user, const char* pass, popsession** sp){
00028
00029
00030
00031 int r=0;
00032 char* resp=NULL;
00033 char* err=NULL;
00034 popsession* s;
00035
00036 if(!(servername && user && pass)){
00037 err=strdup("NULL args !");
00038 return(err);
00039 }
00040 s=(popsession*)malloc(sizeof(popsession));
00041 if(!s){
00042 err=strdup("malloc");
00043 return(err);
00044 }
00045 s->server=NULL;
00046 s->connection=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));
00047 if(!(s->connection)){
00048 err=strdup("malloc");
00049 free(s);s=NULL;
00050 return(err);
00051 }
00052 r=pop3_prepare(servername,110,s->connection,s->server);
00053 if(r==-1){
00054 err=strdup("pop3_prepare");
00055 free(s->connection);s->connection=NULL;
00056 free(s);s=NULL;
00057 return(err);
00058 }
00059 s->sock=r;
00060 resp=pop3_connect(s->sock,s->connection);
00061 if(!resp){
00062 err=strdup("pop3_connect");
00063 pop3_disconnect(s->sock);
00064 free(s->connection);s->connection=NULL;
00065 free(s);s=NULL;
00066 return(err);
00067 }
00068 free(resp);
00069 resp=pop3_user(s->sock,user);
00070 if((!resp) || pop3_error(resp)){
00071 pop3_disconnect(s->sock);
00072 free(s->connection);s->connection=NULL;
00073 free(s);s=NULL;
00074 err=resp?resp:strdup("pop3_user");
00075 return(err);
00076 }
00077 free(resp);
00078 resp=pop3_pass(s->sock,pass);
00079 if((!resp) || pop3_error(resp)){
00080 pop3_disconnect(s->sock);
00081 free(s->connection);s->connection=NULL;
00082 free(s);s=NULL;
00083 err=resp?resp:strdup("pop3_pass");
00084 return(err);
00085 }
00086 s->state=TRANSACTION;
00087 free(resp);resp=NULL;
00088 resp=pop3_stat(s->sock);
00089 if((!resp) || pop3_error(resp)){
00090 pop3_disconnect(s->sock);
00091 free(s->connection);s->connection=NULL;
00092 free(s);s=NULL;
00093 err=resp?resp:strdup("pop3_stat");
00094 return(err);
00095 }
00096 s->bytes=stat2bytes(resp);
00097 s->last=stat2last(resp);
00098 free(resp);
00099 resp=pop3_list(s->sock,0);
00100 if((!resp) || pop3_error(resp)){
00101 pop3_disconnect(s->sock);
00102 free(s->connection);s->connection=NULL;
00103 free(s);s=NULL;
00104 err=resp?resp:strdup("pop3_list");
00105 return(err);
00106 }
00107 s->list=list2array(resp);
00108 free(resp);resp=NULL;
00109 resp=pop3_uidl(s->sock,0);
00110 if((!resp) || pop3_error(resp)){
00111 pop3_disconnect(s->sock);
00112 free(s->connection);s->connection=NULL;
00113 free(s);s=NULL;
00114 err=resp?resp:strdup("pop3_uidl");
00115 return(err);
00116 }
00117 s->uidl=uidl2array(resp);
00118 s->del=0;
00119 (*sp)=s;
00120 free(resp);resp=NULL;
00121 return(NULL);
00122 }
00123
00124 char* popgethead(popsession* session, int id){
00125
00126 char* resp;
00127 char* msg;
00128 if(!session){
00129 return(NULL);
00130 }
00131 if((id>popnum(session)) || (id < 1)){
00132 return(NULL);
00133 }
00134 resp=pop3_top(session->sock,id,0);
00135 if((!resp) || pop3_error(resp)){
00136 if(resp){
00137 free(resp);
00138 }
00139 return(NULL);
00140 }
00141 msg=retr2msg(resp);
00142 if(!msg){
00143 msg=resp;
00144 }else{
00145 free(resp);
00146 }
00147 return(msg);
00148 }
00149
00150 char* popgetmsg(popsession* session, int id){
00151
00152 char* resp;
00153 char* msg;
00154
00155 if(!session){
00156 return(NULL);
00157 }
00158 if((id > popnum(session)) || (id<1)){
00159 return(NULL);
00160 }
00161 resp=pop3_retr(session->sock,id);
00162 if((!resp) || pop3_error(resp)){
00163 if(resp){
00164 free(resp);
00165 }
00166 return(NULL);
00167 }
00168 msg=retr2msg(resp);
00169 if(!msg){
00170 msg=resp;
00171 }else{
00172 free(resp);
00173 }
00174 if(session->del){
00175 pop3_dele(session->sock,id);
00176 }
00177 return(msg);
00178 }
00179 int popdelmsg(popsession* session, int id){
00180
00181
00182 char* resp;
00183 if(!session){
00184 return(-1);
00185 }
00186 if((id > popnum(session)) || (id < 1)){
00187 return(-1);
00188 }
00189 resp=pop3_dele(session->sock,id);
00190 if((!resp) || pop3_error(resp)){
00191 if(resp){
00192 free(resp);
00193 }
00194 return(-1);
00195 }
00196 free(resp);
00197 resp=pop3_stat(session->sock);
00198 if((!resp) || pop3_error(resp)){
00199 pop3_disconnect(session->sock);
00200 free(session->connection);session->connection=NULL;
00201 free(session);session=NULL;
00202 return(-1);
00203 }
00204 session->bytes=stat2bytes(resp);
00205 session->last=stat2last(resp);
00206 free(resp);
00207 resp=pop3_list(session->sock,0);
00208 if((!resp) || pop3_error(resp)){
00209 pop3_disconnect(session->sock);
00210 free(session->connection);session->connection=NULL;
00211 free(session);session=NULL;
00212 return(-1);
00213 }
00214 freelistarray(session->list);
00215 session->list=list2array(resp);
00216 free(resp);resp=NULL;
00217 resp=pop3_uidl(session->sock,0);
00218 if((!resp) || pop3_error(resp)){
00219 pop3_disconnect(session->sock);
00220 free(session->connection);session->connection=NULL;
00221 free(session);session=NULL;
00222 return(-1);
00223 }
00224 freeuidlarray(session->uidl);
00225 session->uidl=uidl2array(resp);
00226 free(resp);resp=NULL;
00227 return(0);
00228 }
00229 int popcancel(popsession* session){
00230
00231
00232 char* resp;
00233 if(!session){
00234 return(-1);
00235 }
00236 resp=pop3_rset(session->sock);
00237 if((!resp) || pop3_error(resp)){
00238 if(resp){
00239 free(resp);
00240 }
00241 return(-1);
00242 }
00243 free(resp);
00244 resp=pop3_stat(session->sock);
00245 if((!resp) || pop3_error(resp)){
00246 pop3_disconnect(session->sock);
00247 free(session->connection);session->connection=NULL;
00248 free(session);session=NULL;
00249 return(-1);
00250 }
00251 session->bytes=stat2bytes(resp);
00252 session->last=stat2last(resp);
00253 free(resp);
00254 resp=pop3_list(session->sock,0);
00255 if((!resp) || pop3_error(resp)){
00256 pop3_disconnect(session->sock);
00257 free(session->connection);session->connection=NULL;
00258 free(session);session=NULL;
00259 return(-1);
00260 }
00261 freelistarray(session->list);
00262 session->list=list2array(resp);
00263 free(resp);resp=NULL;
00264 resp=pop3_uidl(session->sock,0);
00265 if((!resp) || pop3_error(resp)){
00266 pop3_disconnect(session->sock);
00267 free(session->connection);session->connection=NULL;
00268 free(session);session=NULL;
00269 return(-1);
00270 }
00271 freeuidlarray(session->uidl);
00272 session->uidl=uidl2array(resp);
00273 free(resp);resp=NULL;
00274 return(0);
00275 }
00276
00277 void popend(popsession* session){
00278
00279 int i;
00280 char* resp;
00281
00282 if(!session){return;}
00283 resp=pop3_quit(session->sock);
00284 free(resp);resp=NULL;
00285 pop3_disconnect(session->sock);
00286 free(session->connection);
00287
00288 free(session->list);
00289 for(i=0;i<=session->last;i++){
00290 free(session->uidl[i]);
00291 }
00292 free(session->uidl);
00293 free(session);
00294 return;
00295 }
00296
00297