PageRenderTime 64ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 1ms

/trunk/Jabber-net/jabber/protocol/iq/VCard.cs

#
C# | 989 lines | 566 code | 73 blank | 350 comment | 67 complexity | 6bb0038da7a9b144dc488c352fd37aac MD5 | raw file
Possible License(s): LGPL-3.0, BSD-3-Clause
  1. /* --------------------------------------------------------------------------
  2. * Copyrights
  3. *
  4. * Portions created by or assigned to Cursive Systems, Inc. are
  5. * Copyright (c) 2002-2008 Cursive Systems, Inc. All Rights Reserved. Contact
  6. * information for Cursive Systems, Inc. is available at
  7. * http://www.cursive.net/.
  8. *
  9. * License
  10. *
  11. * Jabber-Net is licensed under the LGPL.
  12. * See LICENSE.txt for details.
  13. * --------------------------------------------------------------------------*/
  14. using System;
  15. using System.Xml;
  16. using bedrock.util;
  17. // http://www.xmpp.org/extensions/xep-0054.html
  18. namespace jabber.protocol.iq
  19. {
  20. /// <summary>
  21. /// Type of telephone number.
  22. /// </summary>
  23. public enum TelephoneType
  24. {
  25. /// <summary>
  26. /// None specified
  27. /// </summary>
  28. unknown = -1,
  29. /// <summary>
  30. /// voice
  31. /// </summary>
  32. voice,
  33. /// <summary>
  34. /// fax
  35. /// </summary>
  36. fax,
  37. /// <summary>
  38. /// pager
  39. /// </summary>
  40. pager,
  41. /// <summary>
  42. /// voice mail
  43. /// </summary>
  44. msg,
  45. /// <summary>
  46. /// mobile
  47. /// </summary>
  48. cell,
  49. /// <summary>
  50. /// video phone
  51. /// </summary>
  52. video,
  53. /// <summary>
  54. /// Bulletin Board System
  55. /// </summary>
  56. bbs,
  57. /// <summary>
  58. /// Modem
  59. /// </summary>
  60. modem,
  61. /// <summary>
  62. /// ISDN
  63. /// </summary>
  64. isdn,
  65. /// <summary>
  66. /// dunno.
  67. /// </summary>
  68. pcs
  69. };
  70. /// <summary>
  71. /// Telephone location
  72. /// </summary>
  73. public enum TelephoneLocation
  74. {
  75. /// <summary>
  76. /// Home
  77. /// </summary>
  78. home,
  79. /// <summary>
  80. /// Work
  81. /// </summary>
  82. work,
  83. /// <summary>
  84. /// Unknown
  85. /// </summary>
  86. unknown
  87. }
  88. /// <summary>
  89. /// Address location
  90. /// </summary>
  91. public enum AddressLocation
  92. {
  93. /// <summary>
  94. /// Home
  95. /// </summary>
  96. home,
  97. /// <summary>
  98. /// Work
  99. /// </summary>
  100. work,
  101. /// <summary>
  102. /// Unknown
  103. /// </summary>
  104. unknown
  105. }
  106. /// <summary>
  107. /// Email type attribute
  108. /// </summary>
  109. public enum EmailType
  110. {
  111. /// <summary>
  112. /// None specified
  113. /// </summary>
  114. NONE = -1,
  115. /// <summary>
  116. /// Home
  117. /// </summary>
  118. home,
  119. /// <summary>
  120. /// Work
  121. /// </summary>
  122. work,
  123. /// <summary>
  124. /// Internet
  125. /// </summary>
  126. internet,
  127. /// <summary>
  128. /// x400
  129. /// </summary>
  130. x400
  131. }
  132. /// <summary>
  133. /// IQ packet with a version query element inside.
  134. /// </summary>
  135. [SVN(@"$Id: VCard.cs 724 2008-08-06 18:09:25Z hildjj $")]
  136. public class VCardIQ : jabber.protocol.client.TypedIQ<VCard>
  137. {
  138. /// <summary>
  139. /// Create a vCard IQ
  140. /// </summary>
  141. /// <param name="doc"></param>
  142. public VCardIQ(XmlDocument doc) : base(doc)
  143. {
  144. }
  145. /// <summary>
  146. /// returns the vCard element for this iq.
  147. /// </summary>
  148. public VCard VCard
  149. {
  150. get { return Instruction; }
  151. }
  152. }
  153. /// <summary>
  154. /// A vCard element.
  155. /// </summary>
  156. [SVN(@"$Id: VCard.cs 724 2008-08-06 18:09:25Z hildjj $")]
  157. public class VCard : Element
  158. {
  159. /// <summary>
  160. ///
  161. /// </summary>
  162. /// <param name="doc"></param>
  163. public VCard(XmlDocument doc) : base("vCard", URI.VCARD, doc)
  164. {
  165. // SetElem("PRODID", "jabber-net: " + this.GetType().Assembly.FullName);
  166. }
  167. /// <summary>
  168. ///
  169. /// </summary>
  170. /// <param name="prefix"></param>
  171. /// <param name="qname"></param>
  172. /// <param name="doc"></param>
  173. public VCard(string prefix, XmlQualifiedName qname, XmlDocument doc) :
  174. base(prefix, qname, doc)
  175. {
  176. }
  177. /// <summary>
  178. /// Full name of the individual, as a single string
  179. /// </summary>
  180. public string FullName
  181. {
  182. get { return GetElem("FN"); }
  183. set { SetElem("FN", value); }
  184. }
  185. /// <summary>
  186. /// Pieces of the name, split apart
  187. /// </summary>
  188. public VName ComplexName
  189. {
  190. get { return this["N"] as VName; }
  191. set { ReplaceChild(value); }
  192. }
  193. /// <summary>
  194. /// Person's nick name. This might be a good choice for a default roster nick,
  195. /// for instance.
  196. /// </summary>
  197. public string Nickname
  198. {
  199. get { return GetElem("NICKNAME"); }
  200. set { SetElem("NICKNAME", value); }
  201. }
  202. /// <summary>
  203. /// User's photograph
  204. /// </summary>
  205. public VPhoto Photo
  206. {
  207. get { return this["PHOTO"] as VPhoto; }
  208. set { ReplaceChild(value); }
  209. }
  210. /// <summary>
  211. /// Date of birth
  212. /// </summary>
  213. public DateTime Birthday
  214. {
  215. get
  216. {
  217. DateTime dt = DateTime.MinValue;
  218. DateTime.TryParse(GetElem("BDAY"), out dt);
  219. return dt;
  220. }
  221. set { SetElem("BDAY", value.ToString("yyyy-MM-dd")); }
  222. }
  223. /// <summary>
  224. /// Associated URL
  225. /// </summary>
  226. public System.Uri Url
  227. {
  228. get
  229. {
  230. string url = GetElem("URL");
  231. if ((url == null) || (url == ""))
  232. return null;
  233. try
  234. {
  235. Uri uri = new Uri(url);
  236. return uri;
  237. }
  238. catch (UriFormatException)
  239. {
  240. return null;
  241. }
  242. }
  243. set { SetElem("URL", value.ToString()); }
  244. }
  245. /// <summary>
  246. ///
  247. /// </summary>
  248. public VOrganization Organization
  249. {
  250. get { return this["ORG"] as VOrganization; }
  251. set { this.ReplaceChild(value); }
  252. }
  253. /// <summary>
  254. ///
  255. /// </summary>
  256. public string Title
  257. {
  258. get { return GetElem("TITLE"); }
  259. set { SetElem("TITLE", value); }
  260. }
  261. /// <summary>
  262. ///
  263. /// </summary>
  264. public string Role
  265. {
  266. get { return GetElem("ROLE"); }
  267. set { SetElem("ROLE", value); }
  268. }
  269. /// <summary>
  270. /// Jabber ID
  271. /// </summary>
  272. public JID JabberId
  273. {
  274. get { return GetElem("JABBERID"); }
  275. set { SetElem("JABBERID", value); }
  276. }
  277. /// <summary>
  278. ///
  279. /// </summary>
  280. public string Description
  281. {
  282. get { return GetElem("DESC"); }
  283. set { SetElem("DESC", value); }
  284. }
  285. /// <summary>
  286. /// List of telephone numbers
  287. /// </summary>
  288. /// <returns></returns>
  289. public VTelephone[] GetTelephoneList()
  290. {
  291. XmlNodeList nl = GetElementsByTagName("TEL", URI.VCARD);
  292. VTelephone[] numbers = new VTelephone[nl.Count];
  293. int i=0;
  294. foreach (XmlNode n in nl)
  295. {
  296. numbers[i] = (VTelephone) n;
  297. i++;
  298. }
  299. return numbers;
  300. }
  301. /// <summary>
  302. ///
  303. /// </summary>
  304. /// <param name="type"></param>
  305. /// <param name="location"></param>
  306. /// <returns></returns>
  307. public VTelephone GetTelephone(TelephoneType type, TelephoneLocation location)
  308. {
  309. foreach (VTelephone tel in GetTelephoneList())
  310. {
  311. if ((tel.Location == location) && (tel.Type == type))
  312. return tel;
  313. }
  314. return null;
  315. }
  316. /// <summary>
  317. /// List of addresses
  318. /// </summary>
  319. /// <returns></returns>
  320. public VAddress[] GetAddressList()
  321. {
  322. XmlNodeList nl = GetElementsByTagName("ADR", URI.VCARD);
  323. VAddress[] addresses = new VAddress[nl.Count];
  324. int i=0;
  325. foreach (XmlNode n in nl)
  326. {
  327. addresses[i] = (VAddress) n;
  328. i++;
  329. }
  330. return addresses;
  331. }
  332. /// <summary>
  333. /// Get the address for the given location.
  334. /// </summary>
  335. /// <param name="location"></param>
  336. /// <returns></returns>
  337. public VAddress GetAddress(AddressLocation location)
  338. {
  339. foreach (VAddress adr in GetAddressList())
  340. {
  341. if (adr.Location == location)
  342. return adr;
  343. }
  344. return null;
  345. }
  346. /// <summary>
  347. /// List of Email addresses
  348. /// </summary>
  349. /// <returns></returns>
  350. public VEmail[] GetEmailList()
  351. {
  352. XmlNodeList nl = GetElementsByTagName("EMAIL", URI.VCARD);
  353. VEmail[] emails = new VEmail[nl.Count];
  354. int i=0;
  355. foreach (XmlNode n in nl)
  356. {
  357. emails[i] = (VEmail)n;
  358. i++;
  359. }
  360. return emails;
  361. }
  362. /// <summary>
  363. /// Get the email address for the given type.
  364. /// </summary>
  365. /// <param name="type"></param>
  366. /// <returns></returns>
  367. public VEmail GetEmail(EmailType type)
  368. {
  369. foreach (VEmail email in GetEmailList())
  370. {
  371. if (email.Type == type)
  372. return email;
  373. }
  374. return null;
  375. }
  376. /// <summary>
  377. /// Sets the email address for the given type.
  378. /// </summary>
  379. /// <param name="email"></param>
  380. public void SetEmail(VEmail email)
  381. {
  382. VEmail existing = GetEmail(email.Type);
  383. if (existing == null)
  384. {
  385. AddChild(email);
  386. }
  387. else
  388. {
  389. existing.UserId = email.UserId;
  390. }
  391. }
  392. /// <summary>
  393. /// Get the internet email address (default)
  394. /// </summary>
  395. /// <returns></returns>
  396. public string Email
  397. {
  398. get
  399. {
  400. VEmail vemail = GetEmail(EmailType.internet);
  401. return vemail == null ? null : vemail.UserId;
  402. }
  403. }
  404. /// <summary>
  405. ///
  406. /// </summary>
  407. [SVN(@"$Id: VCard.cs 724 2008-08-06 18:09:25Z hildjj $")]
  408. public class VName : Element
  409. {
  410. /// <summary>
  411. ///
  412. /// </summary>
  413. /// <param name="doc"></param>
  414. public VName(XmlDocument doc) : base("N", URI.VCARD, doc)
  415. {
  416. }
  417. /// <summary>
  418. ///
  419. /// </summary>
  420. /// <param name="prefix"></param>
  421. /// <param name="qname"></param>
  422. /// <param name="doc"></param>
  423. public VName(string prefix, XmlQualifiedName qname, XmlDocument doc) :
  424. base(prefix, qname, doc)
  425. {
  426. }
  427. /// <summary>
  428. /// Given (first) name
  429. /// </summary>
  430. public string Given
  431. {
  432. get { return GetElem("GIVEN"); }
  433. set { SetElem("GIVEN", value); }
  434. }
  435. /// <summary>
  436. /// Family (last) name
  437. /// </summary>
  438. public string Family
  439. {
  440. get { return GetElem("FAMILY"); }
  441. set { SetElem("FAMILY", value); }
  442. }
  443. /// <summary>
  444. /// Middle name
  445. /// </summary>
  446. public string Middle
  447. {
  448. get { return GetElem("MIDDLE"); }
  449. set { SetElem("MIDDLE", value); }
  450. }
  451. }
  452. /// <summary>
  453. /// vCard Org Element
  454. /// </summary>
  455. [SVN(@"$Id: VCard.cs 724 2008-08-06 18:09:25Z hildjj $")]
  456. public class VOrganization : Element
  457. {
  458. /// <summary>
  459. ///
  460. /// </summary>
  461. /// <param name="doc"></param>
  462. public VOrganization(XmlDocument doc) : base("ORG", URI.VCARD, doc)
  463. {
  464. }
  465. /// <summary>
  466. ///
  467. /// </summary>
  468. /// <param name="prefix"></param>
  469. /// <param name="qname"></param>
  470. /// <param name="doc"></param>
  471. public VOrganization(string prefix, XmlQualifiedName qname, XmlDocument doc) :
  472. base(prefix, qname, doc)
  473. {
  474. }
  475. /// <summary>
  476. /// Orginization Name
  477. /// </summary>
  478. public string OrgName
  479. {
  480. get { return GetElem("ORGNAME"); }
  481. set { SetElem("ORGNAME", value); }
  482. }
  483. /// <summary>
  484. ///
  485. /// </summary>
  486. public string Unit
  487. {
  488. get { return GetElem("ORGUNIT"); }
  489. set { SetElem("ORGUNIT", value); }
  490. }
  491. }
  492. /// <summary>
  493. /// vCard Telephone Element
  494. /// </summary>
  495. [SVN(@"$Id: VCard.cs 724 2008-08-06 18:09:25Z hildjj $")]
  496. public class VTelephone : Element
  497. {
  498. /// <summary>
  499. ///
  500. /// </summary>
  501. /// <param name="doc"></param>
  502. public VTelephone(XmlDocument doc) : base("TEL", URI.VCARD, doc)
  503. {
  504. }
  505. /// <summary>
  506. ///
  507. /// </summary>
  508. /// <param name="prefix"></param>
  509. /// <param name="qname"></param>
  510. /// <param name="doc"></param>
  511. public VTelephone(string prefix, XmlQualifiedName qname, XmlDocument doc) :
  512. base(prefix, qname, doc)
  513. {
  514. }
  515. /// <summary>
  516. /// Phone number
  517. /// </summary>
  518. public string Number
  519. {
  520. get { return GetElem("NUMBER"); }
  521. set { SetElem("NUMBER", value); }
  522. }
  523. /// <summary>
  524. ///
  525. /// </summary>
  526. public TelephoneType Type
  527. {
  528. get
  529. {
  530. if (this["VOICE"] != null) return TelephoneType.voice;
  531. else if (this["FAX"] != null) return TelephoneType.fax;
  532. else if (this["MSG"] != null) return TelephoneType.msg;
  533. else return TelephoneType.unknown;
  534. }
  535. set
  536. {
  537. RemoveElem("VOICE");
  538. RemoveElem("FAX");
  539. RemoveElem("MSG");
  540. switch (value)
  541. {
  542. case TelephoneType.voice:
  543. SetElem("VOICE", null);
  544. break;
  545. case TelephoneType.fax:
  546. SetElem("FAX", null);
  547. break;
  548. case TelephoneType.msg:
  549. SetElem("MSG", null);
  550. break;
  551. }
  552. }
  553. }
  554. /// <summary>
  555. ///
  556. /// </summary>
  557. public TelephoneLocation Location
  558. {
  559. get
  560. {
  561. if (this["WORK"] != null) return TelephoneLocation.work;
  562. else if (this["HOME"] != null) return TelephoneLocation.home;
  563. else return TelephoneLocation.unknown;
  564. }
  565. set
  566. {
  567. this.RemoveElem("WORK");
  568. this.RemoveElem("HOME");
  569. switch (value)
  570. {
  571. case TelephoneLocation.work:
  572. SetElem("WORK", null);
  573. break;
  574. case TelephoneLocation.home:
  575. SetElem("HOME", null);
  576. break;
  577. }
  578. }
  579. }
  580. }
  581. /// <summary>
  582. /// vCard Address Element
  583. /// </summary>
  584. [SVN(@"$Id: VCard.cs 724 2008-08-06 18:09:25Z hildjj $")]
  585. public class VAddress : Element
  586. {
  587. /// <summary>
  588. ///
  589. /// </summary>
  590. /// <param name="doc"></param>
  591. public VAddress(XmlDocument doc) : base("ADR", URI.VCARD, doc)
  592. {
  593. }
  594. /// <summary>
  595. ///
  596. /// </summary>
  597. /// <param name="prefix"></param>
  598. /// <param name="qname"></param>
  599. /// <param name="doc"></param>
  600. public VAddress(string prefix, XmlQualifiedName qname, XmlDocument doc) :
  601. base(prefix, qname, doc)
  602. {
  603. }
  604. /// <summary>
  605. ///
  606. /// </summary>
  607. public string Street
  608. {
  609. get { return GetElem("STREET"); }
  610. set { SetElem("STREET", value); }
  611. }
  612. /// <summary>
  613. ///
  614. /// </summary>
  615. public string Locality
  616. {
  617. get { return GetElem("LOCALITY"); }
  618. set { SetElem("LOCALITY", value); }
  619. }
  620. /// <summary>
  621. ///
  622. /// </summary>
  623. public string Region
  624. {
  625. get { return GetElem("REGION"); }
  626. set { SetElem("REGION", value); }
  627. }
  628. /// <summary>
  629. ///
  630. /// </summary>
  631. public string PostalCode
  632. {
  633. get { return GetElem("PCODE"); }
  634. set { SetElem("PCODE", value); }
  635. }
  636. /// <summary>
  637. ///
  638. /// </summary>
  639. public string Country
  640. {
  641. get { return GetElem("CTRY"); }
  642. set { SetElem("CTRY", value); }
  643. }
  644. /// <summary>
  645. ///
  646. /// </summary>
  647. public string Extra
  648. {
  649. get { return GetElem("EXTADD"); }
  650. set { SetElem("EXTADD", value); }
  651. }
  652. /// <summary>
  653. ///
  654. /// </summary>
  655. public AddressLocation Location
  656. {
  657. get
  658. {
  659. if (this["WORK"] != null) return AddressLocation.work;
  660. else if (this["HOME"] != null) return AddressLocation.home;
  661. else return AddressLocation.unknown;
  662. }
  663. set
  664. {
  665. this.RemoveElem("WORK");
  666. this.RemoveElem("HOME");
  667. switch (value)
  668. {
  669. case AddressLocation.work:
  670. SetElem("WORK", null);
  671. break;
  672. case AddressLocation.home:
  673. SetElem("HOME", null);
  674. break;
  675. }
  676. }
  677. }
  678. }
  679. /// <summary>
  680. /// vCard Email Element
  681. /// </summary>
  682. [SVN(@"$Id: VCard.cs 724 2008-08-06 18:09:25Z hildjj $")]
  683. public class VEmail : Element
  684. {
  685. /// <summary>
  686. ///
  687. /// </summary>
  688. /// <param name="doc"></param>
  689. public VEmail(XmlDocument doc) : base("EMAIL", URI.VCARD, doc)
  690. {
  691. }
  692. /// <summary>
  693. ///
  694. /// </summary>
  695. /// <param name="prefix"></param>
  696. /// <param name="qname"></param>
  697. /// <param name="doc"></param>
  698. public VEmail(string prefix, XmlQualifiedName qname, XmlDocument doc) :
  699. base(prefix, qname, doc)
  700. {
  701. }
  702. /// <summary>
  703. /// The e-mail address
  704. /// </summary>
  705. public string UserId
  706. {
  707. get { return GetElem("USERID"); }
  708. set { SetElem("USERID", value); }
  709. }
  710. /// <summary>
  711. /// Is this the preferred e-mail address?
  712. /// </summary>
  713. public bool IsPreferred
  714. {
  715. get { return (this["PREF"] != null); }
  716. set
  717. {
  718. if (value)
  719. SetElem("PREF", null);
  720. else
  721. RemoveElem("PREF");
  722. }
  723. }
  724. /// <summary>
  725. /// What kind of address is this?
  726. /// </summary>
  727. public EmailType Type
  728. {
  729. get
  730. {
  731. if (this["HOME"] != null) return EmailType.home;
  732. else if (this["WORK"] != null) return EmailType.work;
  733. else if (this["INTERNET"] != null) return EmailType.internet;
  734. else if (this["X400"] != null) return EmailType.x400;
  735. else return EmailType.NONE;
  736. }
  737. set
  738. {
  739. RemoveElem("HOME");
  740. RemoveElem("WORK");
  741. RemoveElem("INTERNET");
  742. RemoveElem("X400");
  743. switch (value)
  744. {
  745. case EmailType.home:
  746. SetElem("HOME", null);
  747. break;
  748. case EmailType.work:
  749. SetElem("WORK", null);
  750. break;
  751. case EmailType.internet:
  752. SetElem("INTERNET", null);
  753. break;
  754. case EmailType.x400:
  755. SetElem("X400", null);
  756. break;
  757. }
  758. }
  759. }
  760. }
  761. /// <summary>
  762. /// Geographic location
  763. /// </summary>
  764. [SVN(@"$Id: VCard.cs 724 2008-08-06 18:09:25Z hildjj $")]
  765. public class VGeo : Element
  766. {
  767. /// <summary>
  768. ///
  769. /// </summary>
  770. /// <param name="doc"></param>
  771. public VGeo(XmlDocument doc) : base("GEO", URI.VCARD, doc)
  772. {
  773. }
  774. /// <summary>
  775. ///
  776. /// </summary>
  777. /// <param name="prefix"></param>
  778. /// <param name="qname"></param>
  779. /// <param name="doc"></param>
  780. public VGeo(string prefix, XmlQualifiedName qname, XmlDocument doc) :
  781. base(prefix, qname, doc)
  782. {
  783. }
  784. /// <summary>
  785. /// Latitude
  786. /// </summary>
  787. public double Lat
  788. {
  789. get { return double.Parse(GetElem("LAT")); }
  790. set { SetElem("LAT", string.Format("{0:6f}", value)); }
  791. }
  792. /// <summary>
  793. /// Longitude
  794. /// </summary>
  795. public double Lon
  796. {
  797. get { return double.Parse(GetElem("LON")); }
  798. set { SetElem("LON", string.Format("{0:6f}", value)); }
  799. }
  800. }
  801. /// <summary>
  802. ///
  803. /// </summary>
  804. [SVN(@"$Id: VCard.cs 724 2008-08-06 18:09:25Z hildjj $")]
  805. public class VPhoto : Element
  806. {
  807. /// <summary>
  808. ///
  809. /// </summary>
  810. /// <param name="doc"></param>
  811. public VPhoto(XmlDocument doc) : base("PHOTO", URI.VCARD, doc)
  812. {
  813. }
  814. /// <summary>
  815. ///
  816. /// </summary>
  817. /// <param name="prefix"></param>
  818. /// <param name="qname"></param>
  819. /// <param name="doc"></param>
  820. public VPhoto(string prefix, XmlQualifiedName qname, XmlDocument doc) :
  821. base(prefix, qname, doc)
  822. {
  823. }
  824. /// <summary>
  825. /// The MIME type of the image. Must be set before
  826. /// calling Image.set.
  827. /// </summary>
  828. public System.Drawing.Imaging.ImageFormat ImageType
  829. {
  830. get
  831. {
  832. System.Drawing.Imaging.ImageFormat def = System.Drawing.Imaging.ImageFormat.Png;
  833. // Strip off all but everything after the last slash,
  834. // if any.
  835. string t = GetElem("TYPE");
  836. if ((t == null) || (t == ""))
  837. return def;
  838. string[] parts = t.Split("/".ToCharArray());
  839. if (parts.Length == 0)
  840. return def;
  841. t = parts[parts.Length - 1].ToLower();
  842. switch (t)
  843. {
  844. case "jpeg":
  845. case "jpg":
  846. return System.Drawing.Imaging.ImageFormat.Jpeg;
  847. case "png":
  848. return System.Drawing.Imaging.ImageFormat.Png;
  849. case "bmp":
  850. return System.Drawing.Imaging.ImageFormat.Bmp;
  851. case "gif":
  852. return System.Drawing.Imaging.ImageFormat.Gif;
  853. case "tif":
  854. case "tiff":
  855. return System.Drawing.Imaging.ImageFormat.Tiff;
  856. }
  857. return def;
  858. }
  859. set { SetElem("TYPE", value.ToString().ToLower()); }
  860. }
  861. /// <summary>
  862. /// The bytes associated with the picture
  863. /// </summary>
  864. public byte[] BinVal
  865. {
  866. get
  867. {
  868. string b64 = GetElem("BINVAL");
  869. if (b64 == null)
  870. return null;
  871. return Convert.FromBase64String(b64);
  872. }
  873. set { SetElem("BINVAL", Convert.ToBase64String(value)); }
  874. }
  875. /// <summary>
  876. /// An Image representation of the bytes in the picture.
  877. /// The MimeType MUST be set before calling set.
  878. /// </summary>
  879. public System.Drawing.Image Image
  880. {
  881. get
  882. {
  883. try
  884. {
  885. byte[] bin = this.BinVal;
  886. if (bin == null)
  887. return null;
  888. System.IO.MemoryStream ms = new System.IO.MemoryStream(bin);
  889. return System.Drawing.Image.FromStream(ms);
  890. }
  891. catch
  892. {
  893. return null;
  894. }
  895. }
  896. set
  897. {
  898. try
  899. {
  900. if (value == null)
  901. {
  902. BinVal = new byte[0];
  903. return;
  904. }
  905. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  906. value.Save(ms, this.ImageType);
  907. this.BinVal = ms.GetBuffer();
  908. }
  909. catch
  910. {
  911. }
  912. }
  913. }
  914. }
  915. }
  916. }