QRData.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. using FastReport.Utils;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Security.Policy;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. namespace FastReport.Barcode.QRCode
  8. {
  9. abstract class QRData
  10. {
  11. public string data;
  12. public QRData() { }
  13. public QRData(string data)
  14. {
  15. Unpack(data);
  16. }
  17. public virtual string Pack()
  18. {
  19. return data;
  20. }
  21. public virtual void Unpack(string data)
  22. {
  23. this.data = data;
  24. }
  25. public static QRData Parse(string data)
  26. {
  27. if (data.StartsWith("BEGIN:VCARD"))
  28. return new QRvCard(data);
  29. else if (data.StartsWith("MATMSG:"))
  30. return new QREmailMessage(data);
  31. else if (data.StartsWith("geo:"))
  32. return new QRGeo(data);
  33. else if (data.StartsWith("SMSTO:"))
  34. return new QRSMS(data);
  35. else if (data.StartsWith("tel:"))
  36. return new QRCall(data);
  37. else if (data.StartsWith("BEGIN:VEVENT"))
  38. return new QREvent(data);
  39. else if (data.StartsWith("WIFI:"))
  40. return new QRWifi(data);
  41. else if (Uri.IsWellFormedUriString(data, UriKind.Absolute))
  42. return new QRURI(data);
  43. else if (Regex.IsMatch(data, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"))
  44. return new QREmailAddress(data);
  45. else if (data.StartsWith("SPC"))
  46. return new QRSwiss(data);
  47. else if (data.StartsWith("ST"))
  48. return new QRSberBank(data);
  49. else
  50. return new QRText(data);
  51. }
  52. }
  53. class QRText : QRData
  54. {
  55. public QRText() : base() { }
  56. public QRText(string data) : base(data) { }
  57. }
  58. class QRvCard : QRData
  59. {
  60. public string firstName;
  61. public string lastName;
  62. public string street;
  63. public string zipCode;
  64. public string city;
  65. public string country;
  66. public string fn_card;
  67. public string title;
  68. public string org;
  69. public string url;
  70. public string tel_cell;
  71. public string tel_work_voice;
  72. public string tel_home_voice;
  73. public string email_home_internet;
  74. public string email_work_internet;
  75. public QRvCard() : base() { }
  76. public QRvCard(string data) : base(data) { }
  77. public override string Pack()
  78. {
  79. StringBuilder data = new StringBuilder("BEGIN:VCARD\nVERSION:2.1\n");
  80. if ((firstName != null && firstName != "") ||
  81. (lastName != null && lastName != ""))
  82. {
  83. data.Append("FN:" + firstName + " " + lastName + "\n");
  84. data.Append("N:" + lastName + ";" + firstName + "\n");
  85. }
  86. data.Append(Append("TITLE:", title));
  87. data.Append(Append("ORG:", org));
  88. data.Append(Append("URL:", url));
  89. data.Append(Append("TEL;CELL:", tel_cell));
  90. data.Append(Append("TEL;WORK;VOICE:", tel_work_voice));
  91. data.Append(Append("TEL;HOME;VOICE:", tel_home_voice));
  92. data.Append(Append("EMAIL;HOME;INTERNET:", email_home_internet));
  93. data.Append(Append("EMAIL;WORK;INTERNET:", email_work_internet));
  94. if ((street != null && street != "") ||
  95. (zipCode != null && zipCode != "") ||
  96. (city != null && city != "") ||
  97. (country != null && country != ""))
  98. {
  99. data.Append("ADR:;;" + street + ";" + city + ";;" + zipCode + ";" + country + "\n");
  100. }
  101. data.Append("END:VCARD");
  102. return data.ToString();
  103. }
  104. private string Append(string name, string data)
  105. {
  106. if (data != null && data != "")
  107. return name + data + "\n";
  108. return "";
  109. }
  110. public override void Unpack(string data)
  111. {
  112. string[] lines = data.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
  113. foreach (string line in lines)
  114. {
  115. string[] s = line.Split(new string[] { ":" }, 2, StringSplitOptions.None);
  116. switch (s[0])
  117. {
  118. case "FN":
  119. fn_card = s[1];
  120. break;
  121. case "N":
  122. string[] n = s[1].Split(new string[] { ";" }, StringSplitOptions.None);
  123. lastName = n[0];
  124. firstName = n[1];
  125. break;
  126. case "TITLE":
  127. title = s[1];
  128. break;
  129. case "ORG":
  130. org = s[1];
  131. break;
  132. case "URL":
  133. url = s[1];
  134. break;
  135. case "TEL;CELL":
  136. tel_cell = s[1];
  137. break;
  138. case "TEL;WORK;VOICE":
  139. tel_work_voice = s[1];
  140. break;
  141. case "TEL;HOME;VOICE":
  142. tel_home_voice = s[1];
  143. break;
  144. case "EMAIL;HOME;INTERNET":
  145. email_home_internet = s[1];
  146. break;
  147. case "EMAIL;WORK;INTERNET":
  148. email_work_internet = s[1];
  149. break;
  150. case "ADR":
  151. string[] adr = s[1].Split(new string[] { ";" }, StringSplitOptions.None);
  152. street = adr[2];
  153. city = adr[3];
  154. zipCode = adr[5];
  155. country = adr[6];
  156. break;
  157. }
  158. }
  159. }
  160. }
  161. class QRURI : QRData
  162. {
  163. public QRURI() : base() { }
  164. public QRURI(string data) : base(data) { }
  165. }
  166. class QREmailAddress : QRData
  167. {
  168. public QREmailAddress() : base() { }
  169. public QREmailAddress(string data) : base(data) { }
  170. }
  171. class QREmailMessage : QRData
  172. {
  173. public string msg_to;
  174. public string msg_sub;
  175. public string msg_body;
  176. public QREmailMessage() : base() { }
  177. public QREmailMessage(string data) : base(data) { }
  178. public override string Pack()
  179. {
  180. return "MATMSG:TO:" + msg_to + ";SUB:" + msg_sub + ";BODY:" + msg_body + ";;";
  181. }
  182. public override void Unpack(string data)
  183. {
  184. string[] s = data.Split(new string[] { "MATMSG:TO:", ";SUB:", ";BODY:" }, 4, StringSplitOptions.None);
  185. msg_to = s[1];
  186. msg_sub = s[2];
  187. msg_body = s[3].Remove(s[3].Length - 2, 2);
  188. }
  189. }
  190. class QRSberBank : QRData
  191. {
  192. char Separator = '|';
  193. private string FormatIdentifier="ST";
  194. public string VersionStandart = "0001";
  195. public string Encoding="2";
  196. #region necessary payment details
  197. public string Name;
  198. public string PersonalAcc;
  199. public string BankName;
  200. public string BIC;
  201. public string CorrespAcc;
  202. #endregion
  203. #region Additional payment info
  204. public string Sum;
  205. public string Purpose;
  206. public string PayeeINNB;
  207. public string PayerINN;
  208. public string DrawerStatus;
  209. public string KPP;
  210. public string CBC;
  211. public string OKTMO;
  212. public string PaytReason;
  213. public string TaxPeriod;
  214. public string DocNo;
  215. public DateTime DocDate;
  216. public string TaxPaytKind;
  217. #endregion
  218. #region Another additional payment info
  219. public string LastName;
  220. public string FirstName;
  221. public string MiddleName;
  222. public string PayerAddress;
  223. public string PersonalAccount;
  224. public string DocIdx;
  225. public string PensAcc;
  226. public string Contract;
  227. public string PersAccp;
  228. public string Flat;
  229. public string Phone;
  230. public string PayerIdType;
  231. public string PayerIdNum;
  232. public string ChildFio;
  233. public DateTime BirthDate;
  234. public DateTime PaymTerm;
  235. public string PaymPeriod;
  236. public string Category;
  237. public string ServiceName;
  238. public string CounterId;
  239. public string CounterVal;
  240. public string QuittId;
  241. public DateTime QuittDate;
  242. public string InstNum;
  243. public string ClassNum;
  244. public string SpecFio;
  245. public string AddAmount;
  246. public string RuleId;
  247. public string ExecId;
  248. public string RegType;
  249. public string UIN;
  250. public string TechCode; //specify numbers somewhere
  251. #endregion
  252. public QRSberBank() : base() { }
  253. public QRSberBank(string data) : base(data) { }
  254. public override string Pack()
  255. {
  256. string result = FormatIdentifier;
  257. result += VersionStandart;
  258. result += Encoding;
  259. result += Separator + "Name=" + Name;
  260. result += Separator + "PersonalAcc=" + PersonalAcc;
  261. result += Separator + "BankName=" + BankName;
  262. result += Separator + "BIC=" + BIC;
  263. result += Separator + "CorrespAcc=" + CorrespAcc;
  264. if (!String.IsNullOrWhiteSpace(Sum)) result += Separator + "Sum=" + Sum;
  265. if (!String.IsNullOrWhiteSpace(Purpose)) result += Separator + "Purpose=" + Purpose;
  266. if (!String.IsNullOrWhiteSpace(PayeeINNB)) result += Separator + "PayeeINN=" + PayeeINNB;
  267. if (!String.IsNullOrWhiteSpace(PayerINN)) result += Separator + "PayerINN=" + PayerINN;
  268. if (!String.IsNullOrWhiteSpace(DrawerStatus)) result += Separator + "DrawerStatus=" + DrawerStatus;
  269. if (!String.IsNullOrWhiteSpace(KPP)) result += Separator+ "KPP=" + KPP;
  270. if(!String.IsNullOrWhiteSpace(CBC)) result += Separator+"CBC="+CBC;
  271. if (!String.IsNullOrWhiteSpace(OKTMO)) result += Separator + "OKTMO=" + OKTMO;
  272. if (!String.IsNullOrWhiteSpace(PaytReason)) result += Separator + "PaytReason="+PaytReason;
  273. if (!String.IsNullOrWhiteSpace(TaxPeriod)) result += Separator +"TaxPeriod="+TaxPeriod;
  274. if (!String.IsNullOrWhiteSpace(DocNo)) result += Separator +"DocNo="+DocNo;
  275. if (DocDate != DateTime.MinValue)
  276. {
  277. result += Separator + "DocDate=" + DocDate.ToString("MM.dd.yyyy");
  278. }
  279. if (!String.IsNullOrWhiteSpace(TaxPaytKind)) result += Separator + "TaxPaytKind=" + TaxPaytKind;
  280. if (!String.IsNullOrWhiteSpace(LastName)) result += Separator + "LastName=" + LastName;
  281. if (!String.IsNullOrWhiteSpace(FirstName)) result += Separator +"FirstName="+FirstName;
  282. if (!String.IsNullOrWhiteSpace(MiddleName)) result += Separator +"MiddleName="+MiddleName;
  283. if (!String.IsNullOrWhiteSpace(PayerAddress)) result += Separator +"PayerAddress="+PayerAddress;
  284. if (!String.IsNullOrWhiteSpace(PersonalAccount)) result += Separator +"PersonalAccount="+PersonalAccount;
  285. if (!String.IsNullOrWhiteSpace(DocIdx)) result += Separator + "DocIdx="+DocIdx;
  286. if (!String.IsNullOrWhiteSpace(PensAcc)) result += Separator +"PensAcc="+PensAcc;
  287. if (!String.IsNullOrWhiteSpace(Contract)) result += Separator +"Contract="+Contract;
  288. if (!String.IsNullOrWhiteSpace(PersAccp)) result += Separator +"PersAcc="+PersAccp;
  289. if (!String.IsNullOrWhiteSpace(Flat)) result += Separator +"Flat="+Flat;
  290. if (!String.IsNullOrWhiteSpace(Phone)) result += Separator + "Phone=" + Phone;
  291. if (!String.IsNullOrWhiteSpace(PayerIdType)) result += Separator +"PayerIdType="+PayerIdType;
  292. if (!String.IsNullOrWhiteSpace(PayerIdNum)) result += Separator +"PayerIdNum="+PayerIdNum;
  293. if (!String.IsNullOrWhiteSpace(ChildFio)) result += Separator +"ChildFio="+ChildFio;
  294. if (BirthDate != DateTime.MinValue)
  295. {
  296. result+=Separator+"BirthDate="+BirthDate.ToString("MM.dd.yyyy");
  297. }
  298. if (PaymTerm!=DateTime.MinValue)
  299. {
  300. result+=Separator+"PaymTerm="+PaymTerm.ToString("MM.dd.yyyy");
  301. }
  302. if (!String.IsNullOrWhiteSpace(PaymPeriod)) result += Separator +"PaymPeriod="+PaymPeriod;
  303. if (!String.IsNullOrWhiteSpace(Category)) result += Separator + "Category=" + Category;
  304. if (!String.IsNullOrWhiteSpace(ServiceName)) result += Separator + "ServiceName=" + ServiceName;
  305. if (!String.IsNullOrWhiteSpace(CounterId)) result += Separator + "CounterId=" + CounterId;
  306. if (!String.IsNullOrWhiteSpace(CounterVal)) result += Separator + "CounterVal=" + CounterVal;
  307. if (!String.IsNullOrWhiteSpace(QuittId)) result += Separator + "QuittId=" + QuittId;
  308. if (QuittDate != DateTime.MinValue)
  309. {
  310. result+=Separator+"QuittDate="+QuittDate.ToString("MM.dd.yyyy");
  311. }
  312. if (!String.IsNullOrWhiteSpace(InstNum)) result += Separator + "InstNum=" + InstNum;
  313. if (!String.IsNullOrWhiteSpace(ClassNum)) result += Separator + "ClassNum=" + ClassNum;
  314. if (!String.IsNullOrWhiteSpace(SpecFio)) result += Separator + "SpecFio=" + SpecFio;
  315. if (!String.IsNullOrWhiteSpace(AddAmount)) result += Separator + "AddAmount=" + AddAmount;
  316. if (!String.IsNullOrWhiteSpace(RuleId)) result += Separator + "RuleId=" + RuleId;
  317. if (!String.IsNullOrWhiteSpace(ExecId)) result += Separator + "ExecId=" + ExecId;
  318. if (!String.IsNullOrWhiteSpace(RegType)) result += Separator + "RegType=" + RegType;
  319. if (!String.IsNullOrWhiteSpace(UIN)) result += Separator + "UIN=" + UIN;
  320. if (!String.IsNullOrWhiteSpace(TechCode)) result += Separator + "TechCode=" + TechCode;
  321. return result;
  322. }
  323. public override void Unpack(string data)
  324. {
  325. data = RetrieveServiceData(data);
  326. string[] splitedString = data.Split(Separator);
  327. foreach(string str in splitedString)
  328. {
  329. string[] splitedStr = str.Split(new string[] { "=" }, 2,StringSplitOptions.RemoveEmptyEntries);
  330. switch (splitedStr[0])
  331. {
  332. case "Name":
  333. Name = splitedStr[1];
  334. break;
  335. case "PersonalAcc":
  336. PersonalAcc = splitedStr[1];
  337. break;
  338. case "BankName":
  339. BankName = splitedStr[1];
  340. break;
  341. case "BIC":
  342. BIC = splitedStr[1];
  343. break;
  344. case "CorrespAcc":
  345. CorrespAcc = splitedStr[1];
  346. break;
  347. case "Sum":
  348. Sum = splitedStr[1];
  349. break;
  350. case "Purpose":
  351. Purpose = splitedStr[1];
  352. break;
  353. case "PayeeINN":
  354. PayeeINNB = splitedStr[1];
  355. break;
  356. case "PayerINN":
  357. PayerINN = splitedStr[1];
  358. break;
  359. case "DrawerStatus":
  360. DrawerStatus = splitedStr[1];
  361. break;
  362. case "KPP":
  363. KPP = splitedStr[1];
  364. break;
  365. case "CBC":
  366. CBC = splitedStr[1];
  367. break;
  368. case "OKTMO":
  369. OKTMO = splitedStr[1];
  370. break;
  371. case "PaytReason":
  372. PaytReason = splitedStr[1];
  373. break;
  374. case "TaxPeriod":
  375. TaxPeriod = splitedStr[1];
  376. break;
  377. case "DocNo":
  378. DocNo = splitedStr[1];
  379. break;
  380. case "DocDate":
  381. DocDate = DateTime.Parse(splitedStr[1]);
  382. break;
  383. case "TaxPaytKind":
  384. TaxPaytKind = splitedStr[1];
  385. break;
  386. case "LastName":
  387. LastName = splitedStr[1];
  388. break;
  389. case "FirstName":
  390. FirstName = splitedStr[1];
  391. break;
  392. case "MiddleName":
  393. MiddleName = splitedStr[1];
  394. break;
  395. case "PayerAddress":
  396. PayerAddress = splitedStr[1];
  397. break;
  398. case "PersonalAccount":
  399. PersonalAccount = splitedStr[1];
  400. break;
  401. case "DocIdx":
  402. DocIdx = splitedStr[1];
  403. break;
  404. case "PensAcc":
  405. PensAcc = splitedStr[1];
  406. break;
  407. case "PersAcc":
  408. PersAccp = splitedStr[1];
  409. break;
  410. case "Contract":
  411. Contract = splitedStr[1];
  412. break;
  413. case "Flat":
  414. Flat = splitedStr[1];
  415. break;
  416. case "Phone":
  417. Phone = splitedStr[1];
  418. break;
  419. case "PayerIdType":
  420. PayerIdType = splitedStr[1];
  421. break;
  422. case "PayerIdNum":
  423. PayerIdNum = splitedStr[1];
  424. break;
  425. case "ChildFio":
  426. ChildFio = splitedStr[1];
  427. break;
  428. case "BirthDate":
  429. BirthDate = DateTime.Parse(splitedStr[1]);
  430. break;
  431. case "PaymTerm":
  432. PaymTerm = DateTime.Parse(splitedStr[1]);
  433. break;
  434. case "PaymPeriod":
  435. PaymPeriod = splitedStr[1];
  436. break;
  437. case "Category":
  438. Category = splitedStr[1];
  439. break;
  440. case "ServiceName":
  441. ServiceName = splitedStr[1];
  442. break;
  443. case "CounterId":
  444. CounterId = splitedStr[1];
  445. break;
  446. case "CounterVal":
  447. CounterVal = splitedStr[1];
  448. break;
  449. case "QuittId":
  450. QuittId = splitedStr[1];
  451. break;
  452. case "QuittDate":
  453. QuittDate = DateTime.Parse(splitedStr[1]);
  454. break;
  455. case "InstNum":
  456. InstNum = splitedStr[1];
  457. break;
  458. case "ClassNum":
  459. ClassNum = splitedStr[1];
  460. break;
  461. case "SpecFio":
  462. SpecFio = splitedStr[1];
  463. break;
  464. case "AddAmount":
  465. AddAmount = splitedStr[1];
  466. break;
  467. case "RuleId":
  468. RuleId = splitedStr[1];
  469. break;
  470. case "ExecId":
  471. ExecId = splitedStr[1];
  472. break;
  473. case "RegType":
  474. RegType = splitedStr[1];
  475. break;
  476. case "UIN":
  477. UIN = splitedStr[1];
  478. break;
  479. case "TechCode":
  480. TechCode = splitedStr[1];
  481. break;
  482. }
  483. }
  484. }
  485. private string RetrieveServiceData(string data)
  486. {
  487. int firstSeparatorIndex = data.IndexOf(Separator);
  488. string retrievedData = data.Substring(0, firstSeparatorIndex);
  489. data = data.Substring(firstSeparatorIndex + 1);
  490. FormatIdentifier = retrievedData.Substring(0, 2);
  491. VersionStandart = retrievedData.Substring(2, 4);
  492. Encoding = retrievedData.Substring(6, 1);
  493. return data;
  494. }
  495. }
  496. class QRGeo : QRData
  497. {
  498. public string latitude;
  499. public string longitude;
  500. public string meters;
  501. public QRGeo() : base() { }
  502. public QRGeo(string data) : base(data) { }
  503. public override string Pack()
  504. {
  505. return "geo:" + latitude + "," + longitude + "," + meters;
  506. }
  507. public override void Unpack(string data)
  508. {
  509. string[] s = data.Split(new string[] { "geo:", "," }, 4, StringSplitOptions.None);
  510. latitude = s[1];
  511. longitude = s[2];
  512. meters = s[3];
  513. }
  514. }
  515. class QRSMS : QRData
  516. {
  517. public string sms_to;
  518. public string sms_text;
  519. public QRSMS() : base() { }
  520. public QRSMS(string data) : base(data) { }
  521. public override string Pack()
  522. {
  523. return "SMSTO:" + sms_to + ":" + sms_text;
  524. }
  525. public override void Unpack(string data)
  526. {
  527. string[] s = data.Split(new string[] { "SMSTO:", ":" }, StringSplitOptions.None);
  528. sms_to = s[1];
  529. sms_text = s[2];
  530. }
  531. }
  532. class QRCall : QRData
  533. {
  534. public string tel;
  535. public QRCall() : base() { }
  536. public QRCall(string data) : base(data) { }
  537. public override string Pack()
  538. {
  539. return "tel:" + tel;
  540. }
  541. public override void Unpack(string data)
  542. {
  543. tel = data.Remove(0, 4);
  544. }
  545. }
  546. class QREvent : QRData
  547. {
  548. public string summary;
  549. public DateTime dtStart;
  550. public DateTime dtEnd;
  551. public QREvent() : base() { }
  552. public QREvent(string data) : base(data) { }
  553. public override string Pack()
  554. {
  555. return "BEGIN:VEVENT\nSUMMARY:" + summary +
  556. "\nDTSTART:" + dtStart.Year.ToString("D4") +
  557. dtStart.Month.ToString("D2") +
  558. dtStart.Day.ToString("D2") + "T" +
  559. dtStart.Hour.ToString("D2") +
  560. dtStart.Minute.ToString("D2") +
  561. dtStart.Second.ToString("D2") + "Z" +
  562. "\nDTEND:" + dtEnd.Year.ToString("D4") +
  563. dtEnd.Month.ToString("D2") +
  564. dtEnd.Day.ToString("D2") + "T" +
  565. dtEnd.Hour.ToString("D2") +
  566. dtEnd.Minute.ToString("D2") +
  567. dtEnd.Second.ToString("D2") + "Z" +
  568. "\nEND:VEVENT";
  569. }
  570. public override void Unpack(string data)
  571. {
  572. string[] lines = data.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
  573. string From = "";
  574. string To = "";
  575. foreach (string line in lines)
  576. {
  577. string[] attr = line.Split(new string[] { ":" }, 2, StringSplitOptions.None);
  578. switch (attr[0])
  579. {
  580. case "SUMMARY":
  581. summary = attr[1];
  582. break;
  583. case "DTSTART":
  584. From = attr[1];
  585. break;
  586. case "DTEND":
  587. To = attr[1];
  588. break;
  589. }
  590. }
  591. dtStart = new DateTime(int.Parse(From.Substring(0, 4)),
  592. int.Parse(From.Substring(4, 2)),
  593. int.Parse(From.Substring(6, 2)),
  594. int.Parse(From.Substring(9, 2)),
  595. int.Parse(From.Substring(11, 2)),
  596. int.Parse(From.Substring(13, 2)));
  597. dtEnd = new DateTime(int.Parse(To.Substring(0, 4)),
  598. int.Parse(To.Substring(4, 2)),
  599. int.Parse(To.Substring(6, 2)),
  600. int.Parse(To.Substring(9, 2)),
  601. int.Parse(To.Substring(11, 2)),
  602. int.Parse(To.Substring(13, 2)));
  603. }
  604. }
  605. class QRWifi : QRData
  606. {
  607. public string encryption;
  608. public string networkName;
  609. public string password;
  610. public bool hidden;
  611. public QRWifi() : base() { }
  612. public QRWifi(string data) : base(data) { }
  613. public override string Pack()
  614. {
  615. return "WIFI:T:" + (encryption == "unencrypted" ? "nopass" : encryption) +
  616. ";S:" + networkName + ";P:" + (encryption == "unencrypted" ? "" : password) +
  617. (hidden ? ";H:true;" : ";;");
  618. }
  619. public override void Unpack(string data)
  620. {
  621. string[] s = data.Split(new string[] { "WIFI:T:", ";S:", ";P:", ";H:", ";;" }, StringSplitOptions.None);
  622. encryption = s[1] == "nopass" ? "unencrypted" : s[1];
  623. networkName = s[2];
  624. password = s[3];
  625. hidden = s[4] == "true;" ? true : false;
  626. }
  627. }
  628. class QRSwiss : QRData
  629. {
  630. private string br = "\r\n";
  631. private string alternativeProcedure1, alternativeProcedure2;
  632. private Iban iban;
  633. private decimal? amount;
  634. private Contact creditor, ultimateCreditor, debitor;
  635. private Currency currency;
  636. private Reference reference;
  637. private AdditionalInformation additionalInformation;
  638. private MyRes res;
  639. public Iban _Iban { get { return iban; } set { iban = value; } }
  640. public Contact Creditor { get { return creditor; } set { creditor = value; } }
  641. public Contact Debitor { get { return debitor; } set { debitor = value; } }
  642. public Decimal? Amount { get { return amount; } }
  643. public Currency _Currency { get { return currency; } set { currency = value; } }
  644. public Reference _Reference { get { return reference; } set { reference = value; } }
  645. public AdditionalInformation _AdditionalInformation { get { return additionalInformation; } set { additionalInformation = value; } }
  646. public string AlternativeProcedure1 { get { return alternativeProcedure1; } set { alternativeProcedure1 = value; } }
  647. public string AlternativeProcedure2 { get { return alternativeProcedure2; } set { alternativeProcedure2 = value; } }
  648. //public QRSwiss() : base() { }
  649. public QRSwiss(string data) : base(data)
  650. {
  651. res = new MyRes("Messages,Swiss");
  652. }
  653. public QRSwiss(QRSwissParameters parameters)
  654. {
  655. res = new MyRes("Messages,Swiss");
  656. if (parameters.Iban == null)
  657. throw new SwissQrCodeException(res.Get("SwissNullIban"));
  658. if (parameters.Creditor == null)
  659. throw new SwissQrCodeException(res.Get("SwissNullCreditor"));
  660. if (parameters.Reference == null)
  661. throw new SwissQrCodeException(res.Get("SwissNullReference"));
  662. if (parameters.Currency == null)
  663. throw new SwissQrCodeException(res.Get("SwissNullCurrency"));
  664. this.iban = parameters.Iban;
  665. this.creditor = parameters.Creditor;
  666. this.additionalInformation = parameters.AdditionalInformation != null ? parameters.AdditionalInformation : new AdditionalInformation(null, null);
  667. if (parameters.Amount != null && parameters.Amount.ToString().Length > 12)
  668. throw new SwissQrCodeException(res.Get("SwissAmountLength"));
  669. this.amount = parameters.Amount;
  670. this.currency = parameters.Currency.Value;
  671. this.debitor = parameters.Debitor;
  672. if (iban.IsQrIban && parameters.Reference.RefType != Reference.ReferenceType.QRR)
  673. throw new SwissQrCodeException(res.Get("SwissQRIban"));
  674. if (!iban.IsQrIban && parameters.Reference.RefType == Reference.ReferenceType.QRR)
  675. throw new SwissQrCodeException(res.Get("SwissNonQRIban"));
  676. this.reference = parameters.Reference;
  677. if (parameters.AlternativeProcedure1 != null && parameters.AlternativeProcedure1.Length > 100)
  678. throw new SwissQrCodeException(res.Get("SwissAltProcedureLength"));
  679. this.alternativeProcedure1 = parameters.AlternativeProcedure1;
  680. if (parameters.AlternativeProcedure2 != null && parameters.AlternativeProcedure2.Length > 100)
  681. throw new SwissQrCodeException(res.Get("SwissAltProcedureLength"));
  682. this.alternativeProcedure2 = parameters.AlternativeProcedure2;
  683. }
  684. public override void Unpack(string data)
  685. {
  686. string[] datasWithR = data.Split('\n');
  687. string datass = "";
  688. foreach (string s in datasWithR)
  689. {
  690. datass += s;
  691. }
  692. string[] datas = datass.Split('\r');
  693. List<string> vs = new List<string>();
  694. int counter = 3;
  695. string infoString = "";
  696. this.iban = new Iban(datas[counter]);
  697. counter++;
  698. infoString = "";
  699. for (int i = counter; i < counter + 7; i++)
  700. {
  701. infoString += datas[i] + '\r';
  702. }
  703. counter += 7;
  704. this.creditor = new Contact(infoString);
  705. if (datas[counter] != String.Empty)
  706. {
  707. infoString = String.Empty;
  708. for (int i = counter; i < counter + 7; i++)
  709. {
  710. infoString += datas[i] + '\r';
  711. }
  712. this.ultimateCreditor = new Contact(infoString);
  713. }
  714. counter += 7;
  715. this.amount = datas[counter] == String.Empty ? amount = null : Decimal.Parse(datas[counter].Replace('.', ','));
  716. counter++;
  717. switch (datas[counter])
  718. {
  719. case "EUR":
  720. this.currency = Currency.EUR;
  721. break;
  722. case "CHF":
  723. this.currency = Currency.CHF;
  724. break;
  725. }
  726. counter++;
  727. if (datas[counter] != String.Empty)
  728. {
  729. infoString = String.Empty;
  730. for (int i = counter; i < counter + 7; i++)
  731. {
  732. infoString += datas[i] + '\r';
  733. }
  734. this.debitor = new Contact(infoString);
  735. }
  736. counter += 7;
  737. infoString = String.Empty;
  738. for (int i = counter; i < counter + 2; i++)
  739. {
  740. infoString += datas[i] + '\r';
  741. }
  742. this.reference = new Reference(infoString);
  743. if (reference.RefType == Reference.ReferenceType.QRR)
  744. iban.TypeIban = Iban.IbanType.QrIban;
  745. else
  746. iban.TypeIban = Iban.IbanType.Iban;
  747. if (!String.IsNullOrEmpty(reference.ReferenceText))
  748. {
  749. if (reference.ChecksumMod10(reference.ReferenceText))
  750. reference._ReferenceTextType = Reference.ReferenceTextType.QrReference;
  751. else if (Regex.IsMatch(reference.ReferenceText, @"^[0-9]+$"))
  752. reference._ReferenceTextType = Reference.ReferenceTextType.CreditorReferenceIso11649;
  753. }
  754. counter += 2;
  755. infoString = String.Empty;
  756. for (int i = counter; i < counter + 3; i++)
  757. {
  758. infoString += datas[i] + '\r';
  759. }
  760. this.additionalInformation = new AdditionalInformation(infoString);
  761. counter += 3;
  762. if (datas.Length - 1 >= counter)
  763. {
  764. alternativeProcedure1 = datas[counter];
  765. }
  766. counter++;
  767. if (datas.Length - 1 >= counter)
  768. {
  769. alternativeProcedure2 = datas[counter];
  770. }
  771. }
  772. public override string Pack()
  773. {
  774. string SwissQrCodePayload = "SPC" + br; //QRType
  775. SwissQrCodePayload += "0200" + br; //Version
  776. SwissQrCodePayload += "1" + br; //Coding
  777. //CdtrInf "logical" element
  778. SwissQrCodePayload += iban.ToString() + br; //IBAN
  779. //Cdtr "logical" element
  780. SwissQrCodePayload += creditor.ToString();
  781. //UltmtCdtr "logical" element
  782. //Since version 2.0 ultimate creditor was marked as "for future use" and has to be delivered empty in any case!
  783. //SwissQrCodePayload += string.Concat(Enumerable.Repeat(br, 7).ToArray());
  784. for (int i = 0; i < 7; i++)
  785. {
  786. SwissQrCodePayload += br;
  787. }
  788. //CcyAmtDate "logical" element
  789. //Amoutn has to use . as decimal seperator in any case. See https://www.paymentstandards.ch/dam/downloads/ig-qr-bill-en.pdf page 27.
  790. //SwissQrCodePayload += (amount != null ? amount.ToString().Replace(",", ".") : string.Empty) + br; //Amt
  791. if (amount != null)
  792. {
  793. string strAmount = amount.ToString();
  794. if (!strAmount.Contains("."))
  795. strAmount = amount.ToString().Replace(",", ".");
  796. else
  797. strAmount += ".00";
  798. SwissQrCodePayload += strAmount;
  799. }
  800. else
  801. SwissQrCodePayload += string.Empty;
  802. SwissQrCodePayload += br;
  803. SwissQrCodePayload += currency + br; //Ccy
  804. //UltmtDbtr "logical" element
  805. if (debitor != null)
  806. SwissQrCodePayload += debitor.ToString();
  807. else
  808. for (int i = 0; i < 7; i++)
  809. {
  810. SwissQrCodePayload += br;
  811. }
  812. //RmtInf "logical" element
  813. SwissQrCodePayload += reference.RefType.ToString() + br; //Tp
  814. SwissQrCodePayload += (!string.IsNullOrEmpty(reference.ReferenceText) ? reference.ReferenceText : string.Empty) + br; //Ref
  815. //AddInf "logical" element
  816. SwissQrCodePayload += (!string.IsNullOrEmpty(additionalInformation.UnstructureMessage) ? additionalInformation.UnstructureMessage : string.Empty) + br; //Ustrd
  817. SwissQrCodePayload += additionalInformation.Trailer + br; //Trailer
  818. SwissQrCodePayload += (!string.IsNullOrEmpty(additionalInformation.BillInformation) ? additionalInformation.BillInformation : string.Empty) + br; //StrdBkgInf
  819. //AltPmtInf "logical" element
  820. if (!string.IsNullOrEmpty(alternativeProcedure1))
  821. SwissQrCodePayload += alternativeProcedure1.Replace("\n", "") + br; //AltPmt
  822. if (!string.IsNullOrEmpty(alternativeProcedure2))
  823. SwissQrCodePayload += alternativeProcedure2.Replace("\n", "") + br; //AltPmt
  824. //S-QR specification 2.0, chapter 4.2.3
  825. if (SwissQrCodePayload.EndsWith(br))
  826. SwissQrCodePayload = SwissQrCodePayload.Remove(SwissQrCodePayload.Length - br.Length);
  827. return SwissQrCodePayload;
  828. }
  829. }
  830. }