void Device::ReadBulk(const EndpointPtr & ep, const IObjectOutputStreamPtr &outputStream, int timeout) { IOUSBInterfaceInterface ** interface = ep->GetInterfaceHandle(); size_t transferSize = ep->GetMaxPacketSize(); ByteArray buffer(transferSize); size_t r; do { UInt32 readBytes = buffer.size(); USB_CALL((*interface)->ReadPipe(interface, ep->GetRefIndex(), buffer.data(), &readBytes)); r = outputStream->Write(buffer.data(), readBytes); } while(r == transferSize); }
void Device::WriteBulk(const EndpointPtr & ep, const IObjectInputStreamPtr &inputStream, int timeout) { IOUSBInterfaceInterface ** interface = ep->GetInterfaceHandle(); size_t transferSize = ep->GetMaxPacketSize(); ByteArray buffer(transferSize); size_t r; do { r = inputStream->Read(buffer.data(), buffer.size()); USB_CALL((*interface)->WritePipe(interface, ep->GetRefIndex(), buffer.data(), r)); } while(r == transferSize); }
Urb(int fd, u8 type, const EndpointPtr & ep): Fd(fd), Buffer(PacketsPerBuffer(type) * ep->GetMaxPacketSize()), KernelUrb() { usbdevfs_urb &urb = KernelUrb; urb.type = type; urb.endpoint = ep->GetAddress(); urb.buffer = Buffer.data(); urb.buffer_length = Buffer.size(); }
int CellAcceptor::open(EndpointPtr& endpointPtr) throw (EndpointException&, ExecutionModelException&) { m_endpointPtr = endpointPtr; if (this->m_acceptor.open(endpointPtr->getAddr(), 1) == -1) { return -1; } ThreadPerConnection *tpc = new ThreadPerConnection(); m_tpcPrt = new ACE_Strong_Bound_Ptr<ThreadPerConnection, ACE_Recursive_Thread_Mutex > (tpc); (*m_tpcPrt)->bind(this); (*m_tpcPrt)->open(); return this->reactor()->register_handler (this, ACE_Event_Handler::ACCEPT_MASK); }
u8 Device::TransactionType(const EndpointPtr &ep) { EndpointType type = ep->GetType(); switch(type) { case EndpointType::Control: return USBDEVFS_URB_TYPE_CONTROL; case EndpointType::Isochronous: return USBDEVFS_URB_TYPE_ISO; case EndpointType::Bulk: return USBDEVFS_URB_TYPE_BULK; case EndpointType::Interrupt: return USBDEVFS_URB_TYPE_INTERRUPT; default: throw std::runtime_error("invalid endpoint type"); } }
int P3MeshAcceptor::open(EndpointPtr& endpointPtr) throw (ExecutionModelException&) { m_endpointPtr = endpointPtr; if (this->m_acceptor.open(endpointPtr->getAddr(), 1) == -1) { /*ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%t|%T)INFO: P3MeshAcceptor::open() - failed to open addr(%s,%d)\n"), endpointPtr->getAddr().get_host_name(),endpointPtr->getAddr().get_port_number()));*/ return -1; } ThreadPerConnection *tpc = new ThreadPerConnection(); m_tpcPrt = new ACE_Strong_Bound_Ptr<ThreadPerConnection, ACE_Recursive_Thread_Mutex > (tpc); CPUQoS* cpuQoS = new CPUPriorityQoS(CPUQoS::SCHEDULE_RT_DEFAULT, CPUQoS::MAX_RT_PRIO); CPUReservation* reserve = 0; if (m_mesh->getQoSManager() != 0) { reserve = m_mesh->getQoSManager()->createCPUReservation("HRT", cpuQoS); } tpc->bind(this); tpc->open(reserve, cpuQoS); return this->reactor()->register_handler (this, ACE_Event_Handler::ACCEPT_MASK); }
SubscriptionPtr SubscriptionService::onRequestSubscriptionCompleted( boost::int32_t ret, const std::string & publisherName, RcfClient<I_RequestSubscription> & client, RcfClientPtr rcfClientPtr, OnSubscriptionDisconnect onDisconnect, boost::uint32_t pubToSubPingIntervalMs, bool pingsEnabled) { bool ok = (ret == RcfError_Ok); if (ok) { ClientTransportAutoPtr clientTransportAutoPtr( client.getClientStub().releaseTransport()); I_ServerTransport * pTransport = NULL; I_ServerTransportEx * pTransportEx = NULL; if (clientTransportAutoPtr->isInProcess()) { pTransport = dynamic_cast<I_ServerTransport *>( clientTransportAutoPtr.get()); } else { pTransport = & mpServer->findTransportCompatibleWith( *clientTransportAutoPtr); } pTransportEx = dynamic_cast<I_ServerTransportEx *>(pTransport); I_ServerTransportEx & serverTransportEx = * pTransportEx; SessionPtr sessionPtr = serverTransportEx.createServerSession( clientTransportAutoPtr, StubEntryPtr(new StubEntry(rcfClientPtr)), true); RCF_ASSERT( sessionPtr ); RcfSessionPtr rcfSessionPtr = sessionPtr; rcfSessionPtr->setUserData(client.getClientStub().getUserData()); rcfSessionPtr->setPingTimestamp(); std::string publisherUrl; EndpointPtr epPtr = client.getClientStub().getEndpoint(); if (epPtr) { publisherUrl = epPtr->asString(); } if ( !clientTransportAutoPtr->isInProcess() && !clientTransportAutoPtr->isAssociatedWithIoService()) { AsioServerTransport & asioTransport = dynamic_cast<AsioServerTransport &>( mpServer->getServerTransport()); clientTransportAutoPtr->associateWithIoService(asioTransport.getIoService()); } SubscriptionPtr subscriptionPtr( new Subscription( *this, clientTransportAutoPtr, rcfSessionPtr, pubToSubPingIntervalMs, publisherUrl, publisherName, onDisconnect)); rcfSessionPtr->setOnDestroyCallback( boost::bind( &Subscription::onDisconnect, SubscriptionWeakPtr(subscriptionPtr), _1)); subscriptionPtr->setWeakThisPtr(subscriptionPtr); subscriptionPtr->mPingsEnabled = pingsEnabled; Lock lock(mSubscriptionsMutex); mSubscriptions.insert(subscriptionPtr); return subscriptionPtr; } return SubscriptionPtr(); }
SubscriptionPtr SubscriptionService::onRequestSubscriptionCompleted( boost::int32_t ret, const std::string & publisherName, ClientStub & clientStub, RcfClientPtr rcfClientPtr, OnSubscriptionDisconnect onDisconnect, boost::uint32_t pubToSubPingIntervalMs, bool pingsEnabled) { if (ret != RcfError_Ok) { RCF_THROW( Exception( Error(ret) ) ); } ClientTransportAutoPtr clientTransportAutoPtr( clientStub.releaseTransport() ); ServerTransport * pTransport = NULL; ServerTransportEx * pTransportEx = NULL; pTransport = & mpServer->findTransportCompatibleWith( *clientTransportAutoPtr); pTransportEx = dynamic_cast<ServerTransportEx *>(pTransport); ServerTransportEx & serverTransportEx = * pTransportEx; SessionPtr sessionPtr = serverTransportEx.createServerSession( clientTransportAutoPtr, StubEntryPtr(new StubEntry(rcfClientPtr)), true); RCF_ASSERT( sessionPtr ); RcfSessionPtr rcfSessionPtr = sessionPtr; rcfSessionPtr->setUserData(clientStub.getUserData()); rcfSessionPtr->setPingTimestamp(); std::string publisherUrl; EndpointPtr epPtr = clientStub.getEndpoint(); if (epPtr) { publisherUrl = epPtr->asString(); } //if (!clientTransportAutoPtr->isAssociatedWithIoService()) //{ // AsioServerTransport & asioTransport = dynamic_cast<AsioServerTransport &>( // mpServer->getServerTransport()); // clientTransportAutoPtr->associateWithIoService(asioTransport.getIoService()); //} SubscriptionPtr subscriptionPtr( new Subscription( *this, clientTransportAutoPtr, rcfSessionPtr, pubToSubPingIntervalMs, publisherUrl, publisherName, onDisconnect)); rcfSessionPtr->setOnDestroyCallback( boost::bind( &Subscription::onDisconnect, SubscriptionWeakPtr(subscriptionPtr), _1)); subscriptionPtr->setWeakThisPtr(subscriptionPtr); subscriptionPtr->mPingsEnabled = pingsEnabled; Lock lock(mSubscriptionsMutex); mSubscriptions.insert(subscriptionPtr); return subscriptionPtr; }