You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ServerSharingViewModel.cs 3.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using ReactiveUI;
  2. using Shadowsocks.Model;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Windows.Media.Imaging;
  9. namespace Shadowsocks.ViewModels
  10. {
  11. public class ServerSharingViewModel : ReactiveObject
  12. {
  13. /// <summary>
  14. /// The view model class for the server sharing user control.
  15. /// </summary>
  16. public ServerSharingViewModel()
  17. {
  18. _config = Configuration.Load();
  19. _servers = _config.configs;
  20. _selectedServer = _servers.First();
  21. //_selectedServerUrlImage = new BitmapImage();
  22. UpdateUrlAndImage();
  23. }
  24. private readonly Configuration _config;
  25. private List<Server> _servers;
  26. private Server _selectedServer;
  27. private string _selectedServerUrl;
  28. private BitmapImage _selectedServerUrlImage;
  29. /// <summary>
  30. /// Called when SelectedServer changed
  31. /// to update SelectedServerUrl and SelectedServerUrlImage
  32. /// </summary>
  33. private void UpdateUrlAndImage()
  34. {
  35. // update SelectedServerUrl
  36. SelectedServerUrl = _selectedServer.GetURL(_config.generateLegacyUrl);
  37. // generate QR code
  38. var qrCode = ZXing.QrCode.Internal.Encoder.encode(_selectedServerUrl, ZXing.QrCode.Internal.ErrorCorrectionLevel.L);
  39. var byteMatrix = qrCode.Matrix;
  40. // paint bitmap
  41. int blockSize = Math.Max(1024 / byteMatrix.Height, 1);
  42. Bitmap drawArea = new Bitmap((byteMatrix.Width * blockSize), (byteMatrix.Height * blockSize));
  43. using (var graphics = Graphics.FromImage(drawArea))
  44. {
  45. graphics.Clear(Color.White);
  46. using (var solidBrush = new SolidBrush(Color.Black))
  47. {
  48. for (int row = 0; row < byteMatrix.Width; row++)
  49. {
  50. for (int column = 0; column < byteMatrix.Height; column++)
  51. {
  52. if (byteMatrix[row, column] != 0)
  53. {
  54. graphics.FillRectangle(solidBrush, blockSize * row, blockSize * column, blockSize, blockSize);
  55. }
  56. }
  57. }
  58. }
  59. }
  60. // transform to BitmapImage for binding
  61. BitmapImage bitmapImage = new BitmapImage();
  62. using (MemoryStream memoryStream = new MemoryStream())
  63. {
  64. drawArea.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
  65. memoryStream.Position = 0;
  66. bitmapImage.BeginInit();
  67. bitmapImage.StreamSource = memoryStream;
  68. bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
  69. bitmapImage.EndInit();
  70. }
  71. SelectedServerUrlImage = bitmapImage;
  72. }
  73. public List<Server> Servers
  74. {
  75. get => _servers;
  76. set => this.RaiseAndSetIfChanged(ref _servers, value);
  77. }
  78. public Server SelectedServer
  79. {
  80. get => _selectedServer;
  81. set
  82. {
  83. this.RaiseAndSetIfChanged(ref _selectedServer, value);
  84. UpdateUrlAndImage();
  85. }
  86. }
  87. public string SelectedServerUrl
  88. {
  89. get => _selectedServerUrl;
  90. set => this.RaiseAndSetIfChanged(ref _selectedServerUrl, value);
  91. }
  92. public BitmapImage SelectedServerUrlImage
  93. {
  94. get => _selectedServerUrlImage;
  95. set => this.RaiseAndSetIfChanged(ref _selectedServerUrlImage, value);
  96. }
  97. }
  98. }