CPhoneBook.java
上传用户:shunchung
上传日期:2013-04-07
资源大小:438k
文件大小:10k
源码类别:

手机短信编程

开发平台:

Java

  1. // jSMSEngine API.
  2. // An open-source API package for sending and receiving SMS via a GSM device.
  3. // Copyright (C) 2002-2006, Thanasis Delenikas, Athens/GREECE
  4. // Web Site: http://www.jsmsengine.org
  5. //
  6. // jSMSEngine is a package which can be used in order to add SMS processing
  7. // capabilities in an application. jSMSEngine is written in Java. It allows you
  8. // to communicate with a compatible mobile phone or GSM Modem, and
  9. // send / receive SMS messages.
  10. //
  11. // jSMSEngine is distributed under the LGPL license.
  12. //
  13. // This library is free software; you can redistribute it and/or
  14. // modify it under the terms of the GNU Lesser General Public
  15. // License as published by the Free Software Foundation; either
  16. // version 2.1 of the License, or (at your option) any later version.
  17. // This library is distributed in the hope that it will be useful,
  18. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20. // Lesser General Public License for more details.
  21. // You should have received a copy of the GNU Lesser General Public
  22. // License along with this library; if not, write to the Free Software
  23. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  24. //
  25. package org.jsmsengine;
  26. import java.io.*;
  27. import java.util.*;
  28. import javax.xml.parsers.*;
  29. import org.xml.sax.*;
  30. import org.xml.sax.helpers.*;
  31. /**
  32. This class handles the operation of the phonebook.
  33. <br><br>
  34. The phone book is an XML file, which holds information about destinations.
  35. The phone book is created and maintained by you. When you use a phone book, it
  36. is possible to send messages to "nicknames" define in the book, instead of real
  37. phone numbers. Apart from nicknames, you can also create groups of nicknames,
  38. in order to send an SMS message to more than one destinations, with only one
  39. API call.
  40. <br><br>
  41. <strong>Note: the phone book is optional.</strong>
  42. <br><br>
  43. In the "misc" directory of the distribution tree, you will find a sample phone
  44. book file. A phone book contains:
  45. <ol>
  46. <li> <strong>&lt;phonebookentry&gt;</strong> entries, which define the association
  47. of a person with a mobile number. For each entry, you must define the code
  48. (i.e. nickname), the name (description) and the actual phone.
  49. <li> <strong>&lt;group&gt;</strong> entries. These entries group together one or more
  50. phone book entries. This way, you can define a group as the recipient
  51. of your SMS message, and your message will be send to all individual
  52. members of the group.
  53. </ol>
  54. <br>
  55. When you create a message and you want to use a phonebook nickname (for example
  56. "thanasis"), use it with a "~" symbol in front. This means, set the recipient to value
  57. "~thanasis". When jSMSEngine sees a recipient value starting with "~", it will know
  58. that you mean a nickname, and not the actual phone. However, please keep in mind that
  59. the "~" character does not appear in the phonebook XML definition file.
  60. <br><br>
  61. This class contains all the relevant function for loading the XML phonebook file in memory
  62. (linked lists), and for resolving the names to the respected numbers.
  63. <br><br>
  64. All functions of the class are used internally by jSMSEngine API and are not accecible
  65. to the user.
  66. <br><br>
  67. Comments left to be added in next release.
  68. @see CService#setPhoneBook
  69. @see CService#sendMessage
  70. @see COutgoingMessage
  71. */
  72. class CPhoneBook
  73. {
  74. private static final char PHONE_BOOK_INDICATOR = '~';
  75. private static final int ENTRY_TYPE_NOTFOUND = 0;
  76. private static final int ENTRY_TYPE_ENTRY = 1;
  77. private static final int ENTRY_TYPE_GROUP = 2;
  78. private LinkedList entries;
  79. private LinkedList groups;
  80. public CPhoneBook()
  81. {
  82. this.entries = new LinkedList();
  83. this.groups = new LinkedList();
  84. }
  85. protected boolean load(String file)
  86. {
  87. SAXParserFactory factory;
  88. SAXParser parser;
  89. boolean loaded;
  90. if (file == null)
  91. {
  92. entries = new LinkedList();
  93. groups = new LinkedList();
  94. loaded = true;
  95. }
  96. else
  97. {
  98. loaded = true;
  99. factory = SAXParserFactory.newInstance();
  100. try
  101. {
  102. parser = factory.newSAXParser();
  103. parser.parse(new File(file), new CParser());
  104. }
  105. catch (Exception e) { loaded = false; }
  106. }
  107. return loaded;
  108. }
  109. protected boolean isLoaded() { return (entries.size() > 0 ? true : false); }
  110. protected LinkedList expandPhoneBookEntries(COutgoingMessage message)
  111. {
  112. LinkedList messageList;
  113. String entry;
  114. COutgoingMessage newMessage;
  115. if (message.getRecipient().charAt(0) == PHONE_BOOK_INDICATOR)
  116. {
  117. entry = message.getRecipient().substring(1);
  118. switch (getEntryType(entry))
  119. {
  120. case CPhoneBook.ENTRY_TYPE_ENTRY:
  121. message.setRecipient(getEntryPhone(entry));
  122. messageList = new LinkedList();
  123. messageList.add(message);
  124. break;
  125. case CPhoneBook.ENTRY_TYPE_GROUP:
  126. LinkedList members;
  127. ListIterator iterator;
  128. try
  129. {
  130. messageList = new LinkedList();
  131. members = getGroupMembers(entry);
  132. iterator = members.listIterator(0);
  133. while (iterator.hasNext())
  134. {
  135. newMessage = new COutgoingMessage(getEntryPhone((String) iterator.next()), message.getText());
  136. newMessage.setMessageEncoding(message.getMessageEncoding()); 
  137. messageList.add(newMessage);
  138. }
  139. }
  140. catch (Exception e) { messageList = null; }
  141. break;
  142. default:
  143. messageList = null;
  144. break;
  145. }
  146. }
  147. else
  148. {
  149. messageList = new LinkedList();
  150. messageList.add(message);
  151. }
  152. return messageList;
  153. }
  154. protected LinkedList expandPhoneBookEntries(LinkedList inList)
  155. {
  156. COutgoingMessage message;
  157. LinkedList outList, tmpList;
  158. outList = new LinkedList();
  159. for (int i = 0; i < inList.size(); i ++)
  160. {
  161. message = (COutgoingMessage) inList.get(i);
  162. tmpList = expandPhoneBookEntries(message);
  163. if (tmpList != null) for (int j = 0; j < tmpList.size(); j ++) outList.add((COutgoingMessage) tmpList.get(j));
  164. else return null;
  165. }
  166. return outList;
  167. }
  168. private int getEntryType(String code)
  169. {
  170. if (getEntryName(code) != null) return ENTRY_TYPE_ENTRY;
  171. else if (getGroupName(code) != null) return ENTRY_TYPE_GROUP;
  172. else return ENTRY_TYPE_NOTFOUND;
  173. }
  174. private String getEntryName(String code)
  175. {
  176. CPhoneBookEntry entry = getEntry(code);
  177. return (entry == null ? null : entry.getName());
  178. }
  179. private String getEntryPhone(String code)
  180. {
  181. CPhoneBookEntry entry = getEntry(code);
  182. return (entry == null ? null : entry.getPhone());
  183. }
  184. private String getGroupName(String code)
  185. {
  186. CPhoneBookGroupEntry entry = getGroupEntry(code);
  187. return (entry == null ? null : entry.getName());
  188. }
  189. private LinkedList getGroupMembers(String code)
  190. {
  191. return getGroupEntry(code).getMembers();
  192. }
  193. private CPhoneBookEntry getEntry(String code)
  194. {
  195. CPhoneBookEntry entry;
  196. for (int i = 0; i < entries.size(); i ++)
  197. {
  198. entry = (CPhoneBookEntry) entries.get(i);
  199. if (entry.getCode().equalsIgnoreCase(code)) return entry;
  200. }
  201. return null;
  202. }
  203. private CPhoneBookGroupEntry getGroupEntry(String code)
  204. {
  205. CPhoneBookGroupEntry entry;
  206. for (int i = 0; i < groups.size(); i ++)
  207. {
  208. entry = (CPhoneBookGroupEntry) groups.get(i);
  209. if (entry.getCode().equalsIgnoreCase(code)) return entry;
  210. }
  211. return null;
  212. }
  213. class CPhoneBookEntry
  214. {
  215. private String code, name, phone;
  216. private CPhoneBookEntry()
  217. {
  218. code = null;
  219. name = null;
  220. phone = null;
  221. }
  222. private CPhoneBookEntry(String code, String name, String phone)
  223. {
  224. this.code = code;
  225. this.name = name;
  226. this.phone = phone;
  227. }
  228. private String getCode() { return code; }
  229. private String getName() { return name; }
  230. private String getPhone() { return phone; }
  231. }
  232. class CPhoneBookGroupEntry
  233. {
  234. private String code, name;
  235. private LinkedList members;
  236. private CPhoneBookGroupEntry()
  237. {
  238. code = null;
  239. name = null;
  240. members = new LinkedList();
  241. }
  242. private CPhoneBookGroupEntry(String code, String name)
  243. {
  244. this.code = code;
  245. this.name = name;
  246. members = new LinkedList();
  247. }
  248. private void add(String code) { members.addLast(code); }
  249. private String getCode() { return code; }
  250. private String getName() { return name; }
  251. private LinkedList getMembers() { return members; }
  252. }
  253. class CParser extends DefaultHandler
  254. {
  255. private static final int WHAT_BOOK = 1;
  256. private static final int WHAT_ENTRY = 2;
  257. private static final int WHAT_GROUP = 3;
  258. private int what = 0;
  259. private String element = "";
  260. private String entryCode, entryName, entryPhone;
  261. private String groupCode, groupName;
  262. private CPhoneBookGroupEntry group;
  263. public void startDocument () throws SAXException
  264. {
  265. }
  266. public void endDocument () throws SAXException
  267. {
  268. }
  269. public void startElement (String uri, String lName, String qName, Attributes attrs) throws SAXException
  270. {
  271. element = null;
  272. if (qName.equalsIgnoreCase("phonebook")) what = WHAT_BOOK;
  273. else if (qName.equalsIgnoreCase("phonebookentry")) what = WHAT_ENTRY;
  274. else if (qName.equalsIgnoreCase("group")) what = WHAT_GROUP;
  275. else element = qName;
  276. }
  277. public void endElement (String uri, String lName, String qName) throws SAXException
  278. {
  279. if (qName.equalsIgnoreCase("phonebookentry")) entries.addLast(new CPhoneBookEntry(entryCode, entryName, entryPhone));
  280. else if (qName.equalsIgnoreCase("group")) groups.addLast(group);
  281. }
  282. public void characters (char buf [], int offset, int len) throws SAXException
  283. {
  284. if (new String(buf, offset, len).trim().length() == 0) return;
  285. switch (what)
  286. {
  287. case WHAT_ENTRY:
  288. if (element.equalsIgnoreCase("code")) entryCode = new String(buf, offset, len).trim();
  289. else if (element.equalsIgnoreCase("name")) entryName = new String(buf, offset, len).trim();
  290. else if (element.equalsIgnoreCase("phone")) entryPhone = new String(buf, offset, len).trim();
  291. else if (element != null) throw(new SAXException("Unknown entry: " + element + "."));
  292. break;
  293. case WHAT_GROUP:
  294. if (element.equalsIgnoreCase("code")) groupCode = new String(buf, offset, len).trim();
  295. else if (element.equalsIgnoreCase("name"))
  296. {
  297. groupName = new String(buf, offset, len).trim();
  298. group = new CPhoneBookGroupEntry(groupCode, groupName);
  299. }
  300. else if (element.equalsIgnoreCase("member")) group.add(new String(buf, offset, len).trim());
  301. break;
  302. }
  303. }
  304. }
  305. }