Beispiel #1
0
 private void mainLoop()
 {
     //James should draw up a network state machine diagram to model this mainLoop() function
     while (true)
     {
         if (isClient)
         {
             lock (_lock)
             {
                 working = false;
                 if (stop)
                 {
                     return;
                 }
             }
             //here we assume that if we are in this state we can only possibly be receiving a network request
             NetworkRequest request = (NetworkRequest)receiveMessage(tcpClient);
             //Die if we failed to receive a message
             if (request == null)
             {
                 lock (_lock)
                 {
                     working = false;
                 }
                 break;
             }
             lock (_lock)
             {
                 eventQueue.Enqueue(request);
                 doWork = true;
             }
         }
         while (doWork | !isClient)
         {
             bool           sleep   = false;
             NetworkRequest request = null;
             lock (_lock)
             {
                 if (stop)
                 {
                     return;
                 }
                 if (workQueue.Count() > 0)
                 {
                     working = true;
                     request = workQueue.Dequeue();
                     doWork  = false;
                 }
                 else
                 {
                     working = false;
                     sleep   = true;
                 }
             }
             if (sleep)
             {
                 Thread.Sleep(100);
                 continue;
             }
             handleWork(request);
             doWork = false;
         }
     }
 }
Beispiel #2
0
 private void handleWork(NetworkRequest request)
 {
     Logger.Debug("ClientThread:handleWork");
     if (this.guid.Equals(request.SourceGuid))
     { //if sourceguid=this.guid: make a network request and go from there
         if (request is PushRequest)
         {
             processMyPushRequest((PushRequest)request);
         }
         else if (request is PullRequest)
         {
             processMyPullRequest((PullRequest)request);
         }
         else if (request is QueryRequest)
         {
             processMyQueryRequest((QueryRequest)request);
         }
         else if (request is PushIndexRequest)
         {
             processMyPushIndexRequest((PushIndexRequest)request);
         }
         else
         { //what kind of request is this?
             Logger.Warn("ClientThread:handleWork my request is not a known request instance");
         }
         return;
     }
     else
     {//if sourceguid!=this.guid: receive or send the file requested
         if (request is PushRequest)
         {
             PushRequest pr = (PushRequest)request;
             sendMessage(tcpClient, new NetworkResponse(ResponseType.Yes, "", guid, request.SequenceNumber));
             //readFileToDisk(pr.FileSize, Chunk.PathToChunk(pr));
             string remoteGuid = request.SourceGuid.ToString();
             //string path = Path.Combine(Node.GetBackupDirectory(), remoteGuid, remoteGuid+'_'+pr.ChunkNumber+.tar
             readFileToDisk(pr.FileSize, Chunk.PathToChunk(request.SourceGuid, 0, pr.ChunkNumber));
         }
         else if (request is PullRequest)
         {
             PullRequest pr = (PullRequest) request;
             sendMessage(tcpClient, new NetworkResponse(ResponseType.Yes, "", guid, request.SequenceNumber));
             writeFileToNetwork(Chunk.PathToChunk(pr));
         }
         else if (request is QueryRequest)
         {
             QueryRequest qr = (QueryRequest)request;
             processRemoteQueryRequest(qr);
         }
         else if (request is PushIndexRequest)
         {
             processRemotePushIndexRequest((PushIndexRequest)request);
         }
         else
         { //what kind of request is this?
             Logger.Warn("ClientThread:handleWork remote request is not a known request instance");
         }
     }
 }
Beispiel #3
0
 public void EnqueueWork(NetworkRequest request)
 {
     lock (_lock)
     {
         /*if (!isClient)
         {*/
             working = true;
             workQueue.Enqueue(request);
         /*}*/
     }
 }
Beispiel #4
0
 private void acceptFileTransfer(NetworkRequest request, string path)
 {
     //doWork = true
     //send affirmative response
     //enqueue request in work queue
     //this function should be called when this thread has received a message and that message has been dequeued.
     //if this function is called while this thread is in the wrong state, it will not do anything until a message is received or the socket closes.
     doWork = true;
     working = true;
     this.path = path;
     lock (_lock)
     {
         workQueue.Enqueue(request);
     }
 }