00001 /// 00002 /// \file controller.h 00003 /// High level BlackBerry API class 00004 /// 00005 00006 /* 00007 Copyright (C) 2005-2011, Net Direct Inc. (http://www.netdirect.ca/) 00008 00009 This program is free software; you can redistribute it and/or modify 00010 it under the terms of the GNU General Public License as published by 00011 the Free Software Foundation; either version 2 of the License, or 00012 (at your option) any later version. 00013 00014 This program is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00017 00018 See the GNU General Public License in the COPYING file at the 00019 root directory of this project for more details. 00020 */ 00021 00022 #ifndef __BARRY_CONTROLLER_H__ 00023 #define __BARRY_CONTROLLER_H__ 00024 00025 #include "dll.h" 00026 #include "usbwrap.h" 00027 #include "socket.h" 00028 #include "pin.h" 00029 #include "probe.h" 00030 00031 /// Project namespace, containing all related functions and classes. 00032 /// This is the only namespace applications should be concerned with, 00033 /// for now. 00034 namespace Barry { 00035 00036 // forward declarations 00037 class SocketRoutingQueue; 00038 00039 namespace Mode { 00040 class Mode; 00041 class IpModem; 00042 class Serial; 00043 class JavaLoader; 00044 class JVMDebug; 00045 class RawChannel; 00046 } 00047 00048 // 00049 // Controller class 00050 // 00051 /// The main interface class. This class coordinates the communication to 00052 /// a single handheld. This class also owns the only Usb::Device object 00053 /// the handheld. All other classes reference this one for the low level 00054 /// device object. This class owns the only SocketZero object as well, 00055 /// which is the object that any SocketRoutingQueue is plugged into 00056 /// if constructed that way. 00057 /// 00058 /// To use this class, use the following steps: 00059 /// 00060 /// - Probe the USB bus for matching devices with the Probe class 00061 /// - Create an optional SocketRoutingQueue object and create a 00062 /// read thread for it, or use its default read thread. 00063 /// - Pass one of the probe results into the Controller constructor 00064 /// to connect to the USB device. Pass the routing queue 00065 /// to the Controller constructor here too, if needed. 00066 /// - Create the Mode object of your choice. See m_desktop.h 00067 /// and m_serial.h for these mode classes. You pass 00068 /// your controller object into these mode constructors 00069 /// to create the mode. 00070 /// 00071 class BXEXPORT Controller 00072 { 00073 friend class Barry::Mode::Mode; 00074 friend class Barry::Mode::IpModem; 00075 friend class Barry::Mode::Serial; 00076 friend class Barry::Mode::JavaLoader; 00077 friend class Barry::Mode::JVMDebug; 00078 friend class Barry::Mode::RawChannel; 00079 00080 public: 00081 /// Handheld mode type 00082 enum ModeType { 00083 Unspecified, //< default on start up (unused) 00084 Bypass, //< unsupported, unknown 00085 Desktop, //< desktop mode required for database 00086 //< operation 00087 JavaLoader, //< experimental 00088 JVMDebug, //< experimental 00089 UsbSerData, //< GPRS modem support over USB 00090 UsbSerCtrl, //< internally used behind the scenes 00091 RawChannel //< raw channel 00092 }; 00093 00094 private: 00095 ProbeResult m_result; 00096 Usb::Device m_dev; 00097 Usb::Interface *m_iface; 00098 Pin m_pin; 00099 00100 SocketZero m_zero; 00101 SocketRoutingQueue *m_queue; //< ptr to external object; no delete 00102 00103 private: 00104 void SetupUsb(const ProbeResult &device); 00105 00106 protected: 00107 uint16_t SelectMode(ModeType mode); // returns mode socket 00108 uint16_t SelectMode(ModeType mode, const char *explicitModeName); // returns mode socket 00109 00110 public: 00111 explicit Controller(const ProbeResult &device, 00112 int default_timeout = USBWRAP_DEFAULT_TIMEOUT); 00113 Controller(const ProbeResult &device, SocketRoutingQueue &queue, 00114 int default_timeout = USBWRAP_DEFAULT_TIMEOUT); 00115 ~Controller(); 00116 00117 bool HasQueue() const { return m_queue; } 00118 00119 const ProbeResult& GetProbeResult() const { return m_result; } 00120 }; 00121 00122 } // namespace Barry 00123 00124 #endif 00125