public static bool receiveAcceptFile(Friend friend, string uid) { FileTransfer transfer = TransferManager.getOutgoingTransfer(uid); if (transfer == null) { return(false); } // Send first packet return(TransferManager.sendFileData(friend, uid, 0)); }
public static bool sendFileData(Friend friend, string uid, ulong packet_number) { FileTransfer transfer = TransferManager.getOutgoingTransfer(uid); if (transfer == null) { return(false); } using (MemoryStream m = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(m)) { if (uid != null) { writer.Write(uid); } writer.Write(packet_number); Logging.info("Fetching packet #{0}", packet_number); byte[] data = transfer.getPacketData(packet_number); // Write the data if (data != null) { writer.Write(data.Length); writer.Write(data); } else { writer.Write(0); } } SpixiMessage spixi_message = new SpixiMessage(Guid.NewGuid().ToByteArray(), SpixiMessageCode.fileData, m.ToArray()); StreamMessage message = new StreamMessage(); message.type = StreamMessageCode.data; message.recipient = friend.walletAddress; message.sender = Node.walletStorage.getPrimaryAddress(); message.transaction = new byte[1]; message.sigdata = new byte[1]; message.data = spixi_message.getBytes(); StreamProcessor.sendMessage(friend, message); } return(true); }
public static void completeFileTransfer(byte[] sender, string uid) { Friend friend = FriendList.getFriend(sender); if (friend == null) { return; } FileTransfer transfer = TransferManager.getIncomingTransfer(uid); if (transfer == null) { transfer = TransferManager.getOutgoingTransfer(uid); if (transfer == null) { return; } } transfer.fileStream.Dispose(); transfer.completed = true; removePacketsForFileTransfer(uid); FriendMessage fm = friend.messages.Find(x => x.transferId == uid); fm.completed = true; fm.filePath = transfer.filePath; Node.localStorage.writeMessages(friend.walletAddress, friend.messages); if (friend.chat_page != null) { friend.chat_page.updateFile(uid, "100", true); } }
private void onNavigating(object sender, WebNavigatingEventArgs e) { string current_url = HttpUtility.UrlDecode(e.Url); e.Cancel = true; if (current_url.Equals("ixian:onload", StringComparison.Ordinal)) { onLoad(); } else if (current_url.Equals("ixian:back", StringComparison.Ordinal)) { friend.chat_page = null; Navigation.PopAsync(Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:request", StringComparison.Ordinal)) { Navigation.PushAsync(new WalletReceivePage(friend), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:details", StringComparison.Ordinal)) { Navigation.PushAsync(new ContactDetails(friend, true), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:send", StringComparison.Ordinal)) { Navigation.PushAsync(new WalletSendPage(friend.walletAddress), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:accept", StringComparison.Ordinal)) { onAcceptFriendRequest(); } else if (current_url.Equals("ixian:call", StringComparison.Ordinal)) { displaySpixiAlert("Voice Call", "Coming soon.\nCheck regularly for new version on www.spixi.io", "Ok"); } else if (current_url.Equals("ixian:sendfile", StringComparison.Ordinal)) { //displaySpixiAlert("Send File", "\nCheck regularly for new version on www.spixi.io", "Ok"); onSendFile(); } else if (current_url.Contains("ixian:acceptfile:")) { string[] split = current_url.Split(new string[] { "ixian:acceptfile:" }, StringSplitOptions.None); string id = split[1]; onAcceptFile(id); } else if (current_url.Contains("ixian:openfile:")) { // TODO: save the file path for later instances string[] split = current_url.Split(new string[] { "ixian:openfile:" }, StringSplitOptions.None); string id = split[1]; FileTransfer transfer = TransferManager.getIncomingTransfer(id); if (transfer == null) { transfer = TransferManager.getOutgoingTransfer(id); } if (transfer == null) { displaySpixiAlert("Expired", "File link has expired.", "Ok"); return; } // Open file in default app. May not work, check https://forums.xamarin.com/discussion/103042/how-to-open-pdf-or-txt-file-in-default-app-on-xamarin-forms Device.OpenUri(new Uri(transfer.filePath)); } else if (current_url.Contains("ixian:chat:")) { string[] split = current_url.Split(new string[] { "ixian:chat:" }, StringSplitOptions.None); string msg = split[1]; onSend(msg); } else if (current_url.Contains("ixian:viewPayment:")) { string[] split = current_url.Split(new string[] { "ixian:viewPayment:" }, StringSplitOptions.None); string id = split[1]; onViewPayment(id); } else { // Otherwise it's just normal navigation e.Cancel = false; return; } e.Cancel = true; }
public static bool sendFileData(Friend friend, string uid, ulong packet_number) { FileTransfer transfer = TransferManager.getOutgoingTransfer(uid); if (transfer == null) { return(false); } using (MemoryStream m = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(m)) { writer.Write(uid); writer.Write(packet_number); Logging.info("Sending file packet #{0}", packet_number); byte[] data = transfer.getPacketData(packet_number); // Write the data if (data != null) { writer.Write(data.Length); writer.Write(data); } else { writer.Write(0); } } SpixiMessage spixi_message = new SpixiMessage(SpixiMessageCode.fileData, m.ToArray()); StreamMessage message = new StreamMessage(); message.type = StreamMessageCode.data; message.recipient = friend.walletAddress; message.sender = Node.walletStorage.getPrimaryAddress(); message.transaction = new byte[1]; message.sigdata = new byte[1]; message.data = spixi_message.getBytes(); StreamProcessor.sendMessage(friend, message, false, false, false); } if (friend.chat_page != null) { ulong totalPackets = transfer.fileSize / (ulong)Config.packetDataSize; ulong fp = 0; bool complete = false; if (totalPackets == packet_number) { fp = 100; complete = true; } else { fp = 100 / totalPackets * packet_number; } friend.chat_page.updateFile(uid, fp.ToString(), complete); } return(true); }
public static void completeFileTransfer(byte[] sender, string uid) { Friend friend = FriendList.getFriend(sender); if (friend == null) { return; } bool incoming = true; FileTransfer transfer = TransferManager.getIncomingTransfer(uid); if (transfer == null) { incoming = false; transfer = TransferManager.getOutgoingTransfer(uid); if (transfer == null) { return; } } transfer.fileStream.Dispose(); if (incoming && transfer.fileName != null && transfer.fileName != "") { string final_file_path = Path.Combine(downloadsPath, transfer.fileName); int instance_num = 0; while (File.Exists(final_file_path)) { instance_num++; final_file_path = Path.Combine(downloadsPath, Path.GetFileNameWithoutExtension(transfer.fileName) + "-" + instance_num.ToString() + Path.GetExtension(transfer.fileName)); } File.Move(transfer.filePath, final_file_path); transfer.filePath = final_file_path; } transfer.completed = true; removePacketsForFileTransfer(uid); FriendMessage fm = friend.getMessages(transfer.channel).Find(x => x.transferId == uid); fm.completed = true; fm.filePath = transfer.filePath; Node.localStorage.requestWriteMessages(friend.walletAddress, transfer.channel); if (incoming) { lock (incomingTransfers) { incomingTransfers.Remove(transfer); } } else { lock (outgoingTransfers) { outgoingTransfers.Remove(transfer); } } if (friend.chat_page != null) { friend.chat_page.updateFile(uid, "100", true); } }