using ZXing.QrCode.Internal; using Shadowsocks.Controller; using Shadowsocks.Properties; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.IO.Compression; using System.Linq; using System.Text; using System.Windows.Forms; using Shadowsocks.Model; namespace Shadowsocks.View { public partial class QRCodeForm : Form { private string code; public QRCodeForm(string code) { this.code = code; InitializeComponent(); this.Icon = Icon.FromHandle(Resources.ssw128.GetHicon()); this.Text = I18N.GetString("QRCode and URL"); } private void GenQR(string ssconfig) { string qrText = ssconfig; QRCode code = ZXing.QrCode.Internal.Encoder.encode(qrText, ErrorCorrectionLevel.M); ByteMatrix m = code.Matrix; int blockSize = Math.Max(pictureBox1.Height/m.Height, 1); var qrWidth = m.Width*blockSize; var qrHeight = m.Height*blockSize; var dWidth = pictureBox1.Width - qrWidth; var dHeight = pictureBox1.Height - qrHeight; var maxD = Math.Max(dWidth, dHeight); pictureBox1.SizeMode = maxD >= 7*blockSize ? PictureBoxSizeMode.Zoom : PictureBoxSizeMode.CenterImage; Bitmap drawArea = new Bitmap((m.Width*blockSize), (m.Height*blockSize)); using (Graphics g = Graphics.FromImage(drawArea)) { g.Clear(Color.White); using (Brush b = new SolidBrush(Color.Black)) { for (int row = 0; row < m.Width; row++) { for (int col = 0; col < m.Height; col++) { if (m[row, col] != 0) { g.FillRectangle(b, blockSize*row, blockSize*col, blockSize, blockSize); } } } } } pictureBox1.Image = drawArea; } private void QRCodeForm_Load(object sender, EventArgs e) { var servers = Configuration.Load(); var serverDatas = servers.configs.Select( server => new KeyValuePair(ShadowsocksController.GetServerURL(server), server.FriendlyName()) ).ToList(); listBox1.DataSource = serverDatas; var selectIndex = serverDatas.FindIndex(serverData => serverData.Key.StartsWith(code)); if (selectIndex >= 0) listBox1.SetSelected(selectIndex, true); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { var url = (sender as ListBox)?.SelectedValue.ToString(); GenQR(url); textBoxURL.Text = url; } private void textBoxURL_Click(object sender, EventArgs e) { textBoxURL.SelectAll(); } } }