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();
		}
示例#4
0
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");
		}
	}
示例#6
0
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;                
    }