controller.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "controller.h"
00023 #include "probe.h"
00024 #include "common.h"
00025 #include "protocol.h"
00026 #include "protostructs.h"
00027 #include "data.h"
00028 #include "endian.h"
00029 #include <string.h>
00030
00031 #define __DEBUG_MODE__
00032 #include "debug.h"
00033
00034 namespace Barry {
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 Controller::Controller(const ProbeResult &device)
00046 : m_result(device)
00047 , m_dev(device.m_dev)
00048 , m_iface(0)
00049 , m_pin(device.m_pin)
00050 , m_zero(m_dev, device.m_ep.write, device.m_ep.read, device.m_zeroSocketSequence)
00051 , m_queue(0)
00052 {
00053 dout("Controller: Using non-threaded sockets");
00054 SetupUsb(device);
00055 }
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 Controller::Controller(const ProbeResult &device, SocketRoutingQueue &queue)
00069 : m_result(device)
00070 , m_dev(device.m_dev)
00071 , m_iface(0)
00072 , m_pin(device.m_pin)
00073 , m_zero(queue, device.m_ep.write, device.m_zeroSocketSequence)
00074 , m_queue(&queue)
00075 {
00076 dout("Controller: Using threaded socket router");
00077
00078 SetupUsb(device);
00079
00080
00081 queue.SetUsbDevice(&m_dev, device.m_ep.write, device.m_ep.read);
00082 }
00083
00084 void Controller::SetupUsb(const ProbeResult &device)
00085 {
00086 unsigned char cfg;
00087 if( !m_dev.GetConfiguration(cfg) )
00088 throw Usb::Error(m_dev.GetLastError(),
00089 "Controller: GetConfiguration failed");
00090
00091 if( cfg != BLACKBERRY_CONFIGURATION ) {
00092 if( !m_dev.SetConfiguration(BLACKBERRY_CONFIGURATION) )
00093 throw Usb::Error(m_dev.GetLastError(),
00094 "Controller: SetConfiguration failed");
00095 }
00096
00097 m_iface = new Usb::Interface(m_dev, device.m_interface);
00098
00099 m_dev.ClearHalt(device.m_ep.read);
00100 m_dev.ClearHalt(device.m_ep.write);
00101 }
00102
00103 Controller::~Controller()
00104 {
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 if( m_queue ) {
00117 m_queue->ClearUsbDevice();
00118 m_queue = 0;
00119 }
00120
00121
00122 delete m_iface;
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 }
00144
00145
00146
00147
00148
00149
00150
00151
00152 uint16_t Controller::SelectMode(ModeType mode)
00153 {
00154
00155 Protocol::Packet packet;
00156 packet.socket = 0;
00157 packet.size = htobs(SB_MODE_PACKET_COMMAND_SIZE);
00158 packet.command = SB_COMMAND_SELECT_MODE;
00159 packet.u.socket.socket = htobs(SB_MODE_REQUEST_SOCKET);
00160 packet.u.socket.sequence = 0;
00161 memset(packet.u.socket.u.mode.name, 0, sizeof(packet.u.socket.u.mode.name));
00162
00163 char *modeName = (char *) packet.u.socket.u.mode.name;
00164 switch( mode )
00165 {
00166 case Bypass:
00167 strcpy(modeName, "RIM Bypass");
00168 break;
00169
00170 case Desktop:
00171 strcpy(modeName, "RIM Desktop");
00172 break;
00173
00174 case JavaLoader:
00175 strcpy(modeName, "RIM_JavaLoader");
00176 break;
00177
00178 case UsbSerData:
00179 strcpy(modeName, "RIM_UsbSerData");
00180 break;
00181
00182 case UsbSerCtrl:
00183 strcpy(modeName, "RIM_UsbSerCtrl");
00184 break;
00185
00186 default:
00187 throw std::logic_error("Controller: Invalid mode in SelectMode");
00188 break;
00189 }
00190
00191
00192 Data command(&packet, btohs(packet.size));
00193 Data response;
00194
00195 try {
00196 m_zero.Send(command, response);
00197
00198
00199
00200
00201 Protocol::CheckSize(response, SB_MODE_PACKET_RESPONSE_SIZE);
00202 MAKE_PACKET(modepack, response);
00203 if( modepack->command != SB_COMMAND_MODE_SELECTED ) {
00204 eeout(command, response);
00205 throw Error("Controller: mode not selected");
00206 }
00207
00208 if (mode == Desktop) {
00209
00210
00211
00212
00213 m_zero.HideSequencePacket(false);
00214 m_zero.Receive(response);
00215 m_zero.HideSequencePacket(true);
00216 }
00217
00218
00219 return btohs(modepack->u.socket.socket);
00220 }
00221 catch( Usb::Error & ) {
00222 eout("Controller: error setting desktop mode");
00223 eeout(command, response);
00224 throw;
00225 }
00226 }
00227
00228
00229
00230
00231
00232
00233 }
00234