]> code.citadel.org Git - citadel.git/blobdiff - citadel/event_client.c
Revert xmpp back to a working state
[citadel.git] / citadel / event_client.c
index b3bb59eb8a2622585f51006651f765b4674f5614..3e2cbdccaadea3eeb711acf13b2e2ceee6551ef1 100644 (file)
@@ -398,7 +398,7 @@ void StopCurlWatchers(AsyncIO *IO)
        IO->RecvBuf.fd = 0;
 }
 
-void ShutDownCLient(AsyncIO *IO)
+eNextState ShutDownCLient(AsyncIO *IO)
 {
        CitContext *Ctx =IO->CitContext;
 
@@ -418,11 +418,12 @@ void ShutDownCLient(AsyncIO *IO)
                IO->DNS.Channel = NULL;
        }
        assert(IO->Terminate);
-       IO->Terminate(IO);
+       return IO->Terminate(IO);
 }
 
 void PostInbound(AsyncIO *IO)
 {
+
        switch (IO->NextState) {
        case eSendFile:
                ev_io_start(event_base, &IO->send_event);
@@ -444,6 +445,7 @@ void PostInbound(AsyncIO *IO)
                        break;
                case eDBQuery:
                        StopClientWatchers(IO, 0);
+                       QueueAnDBOperation(IO);
                default:
                        break;
                }
@@ -454,17 +456,18 @@ void PostInbound(AsyncIO *IO)
                ev_io_start(event_base, &IO->recv_event);
                break;
        case eTerminateConnection:
-               ShutDownCLient(IO);
-               break;
        case eAbort:
-               ShutDownCLient(IO);
+               if (ShutDownCLient(IO) == eDBQuery) {
+                       QueueAnDBOperation(IO);
+               }
                break;
        case eSendDNSQuery:
        case eReadDNSReply:
-       case eDBQuery:
        case eConnect:
        case eReadMessage:
                break;
+       case eDBQuery:
+               QueueAnDBOperation(IO);
        }
 }
 eReadState HandleInbound(AsyncIO *IO)
@@ -512,15 +515,15 @@ eReadState HandleInbound(AsyncIO *IO)
                }
 
                if (Finished != eMustReadMore) {
-                       eNextState rc;
-                       assert(IO->ReadDone);
                        ev_io_stop(event_base, &IO->recv_event);
-                       rc = IO->ReadDone(IO);
-                       if  (rc == eDBQuery) {
-                               return QueueAnDBOperation(IO);
+                       IO->NextState = IO->ReadDone(IO);
+                       if  (IO->NextState == eDBQuery) {
+                               if (QueueAnDBOperation(IO) == eAbort)
+                                       return eReadFail;
+                               else
+                                       return eReadSuccess;
                        }
                        else {
-                               IO->NextState = rc;
                                Finished = StrBufCheckBuffer(&IO->RecvBuf);
                        }
                }
@@ -930,9 +933,18 @@ IO_postdns_callback(struct ev_loop *loop, ev_idle *watcher, int revents)
                case eAbort:
 ////                   StopClientWatchers(IO);
                        ShutDownCLient(IO);
+                       break;
+               case eDBQuery:
+                       StopClientWatchers(IO, 0);
+                       QueueAnDBOperation(IO);
+                       break;
                default:
                        break;
                }
+       case eDBQuery:
+               StopClientWatchers(IO, 0);
+               QueueAnDBOperation(IO);
+               break;
        default:
                break;
        }
@@ -1217,8 +1229,13 @@ eNextState KillOtherContextNow(AsyncIO *IO)
 
        SetEVState(IO, eKill);
 
-       if (Ctx->OtherOne->ShutdownAbort != NULL)
-               Ctx->OtherOne->ShutdownAbort(Ctx->OtherOne);
+       if (Ctx->OtherOne->ShutdownAbort != NULL) {
+               Ctx->OtherOne->NextState = eAbort;
+               if (Ctx->OtherOne->ShutdownAbort(Ctx->OtherOne) == eDBQuery) {
+                       StopClientWatchers(Ctx->OtherOne, 0);
+                       QueueAnDBOperation(Ctx->OtherOne);
+               }
+       }
        return eTerminateConnection;
 }
 
@@ -1257,11 +1274,11 @@ void KillAsyncIOContext(AsyncIO *IO)
        case eReadMore:
        case eReadPayload:
        case eReadFile:
-               IO->ReAttachCB = KillOtherContextNow;
+               Ctx->IO.ReAttachCB = KillOtherContextNow;
                QueueAnEventContext(&Ctx->IO);
                break;
        case eDBQuery:
-               IO->ReAttachCB = KillOtherContextNow;
+               Ctx->IO.ReAttachCB = KillOtherContextNow;
                QueueAnDBOperation(&Ctx->IO);
                break;
        case eTerminateConnection: