Example #1
0
        public void Push()
        {
            ThrowExceptionIfNotConnected();
            lock (mutex)
            {
                Log("Sending PUSH command.");
                BinaryEncoder.SendCommand(stream, ConnectionCommand.PUSH);
                using (Context context = new Context(config))
                {
                    List <long> selfMessages = new List <long>();
                    var         toSend       = context.ToSendMessages.ToList();

                    PushCapsula capsula = new PushCapsula();

                    foreach (var message in toSend)
                    {
                        if (message.RecepientId == UserId)
                        {
                            selfMessages.Add((long)message.BlobMessagesId);
                        }
                        capsula.PushMessages.Add(new PushMessage()
                        {
                            RecepientId = (int)message.RecepientId,
                            Priority    = (int)message.Priority
                        });
                    }
                    capsula.MessageToDeleteIds = context.BlobMessages
                                                 .Where(u => u.DoDelete == 1)
                                                 .Select(u => (long)u.PublicId).ToList();

#if (DEBUG)
                    Log($"Sending capsula with {toSend.Count} messages. {capsula.MessageToDeleteIds.Count} will be deleted.");
#endif
                    TextEncoder.SendJson(stream, capsula);
#if (DEBUG)
                    Log($"Sending message blobs.");
#endif
                    foreach (var message in toSend)
                    {
                        BinaryEncoder.SendBytes(stream, message.Blob);
                    }
#if (DEBUG)
                    Log($"Receiving PushResponse");
#endif
                    PushResponse response        = TextEncoder.ReadJson <PushResponse>(stream);
                    var          selfMessagesZip = selfMessages.Zip(response.MessageIds, (u, v) =>
                                                                    new { PrivateId = u, PublicId = v });

                    foreach (var message in selfMessagesZip)
                    {
                        context.BlobMessages.Where(u => u.Id == message.PrivateId)
                        .SingleOrDefault().PublicId = message.PublicId;
                    }
#if (DEBUG)
                    Log("Saving new public ids.");
#endif
                    context.SaveChanges();
#if (DEBUG)
                    Log("Cleaning queue.");
#endif
                    context.Database.ExecuteSqlCommand("delete from TO_SEND_MESSAGES;");
                    context.Database.ExecuteSqlCommand("delete from BLOB_MESSAGES where DO_DELETE=1 and PUBLIC_ID<>null;;");
                    context.SaveChanges();
                }

                Log("Push have been done.");
            }
        }
Example #2
0
        private void Pull()
        {
#if (DEBUG)
            Log("Pulling started.");
            Log("Receiving PushCapsula.");
#endif

            PushCapsula  capsula  = TextEncoder.ReadJson <PushCapsula>(stream);
            PushResponse response = new PushResponse()
            {
                MessageIds = new List <long>()
            };

            using (Context context = new Context(config))
            {
#if (DEBUG)
                Log($"Receiving and saving {capsula.PushMessages.Count} blobs.");
#endif

                foreach (var pushMessage in capsula.PushMessages)
                {
                    BlobMessages blobMessage = new BlobMessages()
                    {
                        Content     = BinaryEncoder.ReceiveBytes(stream),
                        RecepientId = pushMessage.RecepientId,
                        SenderId    = connectionInfo.UserId,
                        Priority    = pushMessage.Priority
                    };
                    context.BlobMessages.Add(blobMessage);
                    context.SaveChanges();

                    if (pushMessage.RecepientId == connectionInfo.UserId)
                    {
                        response.MessageIds.Add(blobMessage.Id);
                        context.ClientsMessagesDownloaded.Add(new ClientsMessagesDownloaded()
                        {
                            BlobMessagesId = blobMessage.Id,
                            ClientsId      = connectionInfo.ClientId
                        });
                    }
                    context.SaveChanges();
                }
#if (DEBUG)
                Log($"Deleting {capsula.MessageToDeleteIds.Count} blobs.");
#endif
                foreach (var toDeleteId in capsula.MessageToDeleteIds)
                {
                    var toDelete = context.BlobMessages
                                   .Where(u => u.RecepientId == connectionInfo.UserId && u.Id == toDeleteId).SingleOrDefault();
                    if (toDelete != null)
                    {
                        context.BlobMessages.Remove(toDelete);
                    }
                }
                context.SaveChanges();
            }


#if (DEBUG)
            Log("Sending push response.");
#endif
            TextEncoder.SendJson(stream, response);
#if (DEBUG)
            Log("Pulling ended.");
#endif
        }