예제 #1
0
Session Connection::newSession(const std::string& name, uint32_t timeout) {
    if (!isOpen())
        throw TransportFailure("Can't create session, connection is not open");
    Session s;
    SessionBase_0_10Access(s).set(impl->newSession(name, timeout));
    return s;
}
예제 #2
0
파일: xport.cpp 프로젝트: maerson/windbg
BOOL
CallBack(
    PNLBLK  pnlblk,
    int     cb
    )
{
    MPACKET *           pMpacket;
    DPACKET *           pDpckt;
    XOSD                xosd;
    LOADDMSTRUCT        lds;
    static int          cbMulti = 0;
    static char *       pbMulti = NULL;


    switch( pnlblk->mtypeBlk ) {
        case mtypeVersionRequest:
            DEBUG_OUT("CallBack:  mtypeVersionRequest\n" );
            TLFunc(tlfSendVersion, pnlblk->hpid, 0, 0);
            break;


        case mtypeSyncMulti:
        case mtypeAsyncMulti:
#if DBG
            if (pnlblk->mtypeBlk == mtypeAsyncMulti) {
                DEBUG_OUT("CallBack:  mtypeAsyncMulti\n" );
                EnterCriticalSection(&csExpecting);
                FExpectingReply = 0;
                LeaveCriticalSection(&csExpecting);
            } else {
                DEBUG_OUT("CallBack:  mtypeSyncMulti\n" );
                EnterCriticalSection(&csExpecting);
                FExpectingReply = 1;
                FExpectingSeq = pnlblk->seq;
                LeaveCriticalSection(&csExpecting);
            }
#endif
            //assert( cb == (int) (pnlblk->cchMessage + sizeof(NLBLK)) );
            if (FConnected) {
                pMpacket = (MPACKET *) pnlblk->rgchData;
                if (pMpacket->packetNum == 0) {
                    if (cbMulti < pMpacket->packetCount * MAX_INTERNAL_PACKET) {
                        pbMulti = realloc(pbMulti, pMpacket->packetCount *
                                          MAX_INTERNAL_PACKET);
                    }
                }
                memcpy(pbMulti + pMpacket->packetNum * MAX_INTERNAL_PACKET,
                       (LPVOID)pMpacket->rgchData, pnlblk->cchMessage - sizeof(MPACKET));
                if (pMpacket->packetNum + 1 == pMpacket->packetCount) {
                    cb = pMpacket->packetNum * MAX_INTERNAL_PACKET +
                      pnlblk->cchMessage - sizeof(MPACKET);
                    if (TLCallBack != NULL) {
                        TLCallBack( pnlblk->hpid, cb, (LPARAM) pbMulti);
                    } else if (LpDmFunc != NULL) {
                        LpDmFunc((DWORD) cb, pbMulti);
                    }
                }
            }
            break;

        case mtypeAsync:
        case mtypeSync:
#if DBG
            if (pnlblk->mtypeBlk == mtypeAsync) {
                DEBUG_OUT("CallBack:  mtypeAsync\n" );
                EnterCriticalSection(&csExpecting);
                FExpectingReply = 0;
                LeaveCriticalSection(&csExpecting);
            } else {
                DEBUG_OUT("CallBack:  mtypeSync\n" );
                EnterCriticalSection(&csExpecting);
                FExpectingReply = 1;
                FExpectingSeq = pnlblk->seq;
                LeaveCriticalSection(&csExpecting);
            }
#endif
            //assert( cb == (int) (pnlblk->cchMessage + sizeof(NLBLK)) );
            if (FConnected) {
                if (TLCallBack != NULL) {
                    DPRINT(("CallBack: calling TLCallBack\n"));
                    TLCallBack( pnlblk->hpid, pnlblk->cchMessage,
                               (LPARAM) pnlblk->rgchData);
                } else if (LpDmFunc != NULL) {
                    DPRINT(("CallBack: calling LpDmFunc\n"));
                    LpDmFunc(pnlblk->cchMessage, (LPVOID)pnlblk->rgchData);
                }
            }
            break;

        case mtypeDisconnect:
            DEBUG_OUT("CallBack:  mtypeDisconnect\n" );
            if (TLCallBack != NULL) {
                RTP rtp = {0};
                rtp.dbc = dbcRemoteQuit;
                rtp.hpid = pnlblk->hpid;
                TLCallBack(pnlblk->hpid, sizeof(rtp), (LPARAM)&rtp);
            }
            if (LpUiServer) {
                pDpckt = (DPACKET *) pnlblk->rgchData;
                LpUiServer( tlcbDisconnect,
                            pDpckt->hpid,
                            pDpckt->htid,
                            pDpckt->fContinue,
                            0
                          );
            }
            SetEvent(hRemoteQuit);
            break;

        case mtypeTransportIsDead:
            DEBUG_OUT("CallBack:  mtypeTransportIsDead\n" );
            TransportFailure();
            return FALSE;
            break;

        case mtypeLoadDM:
            DPRINT(("CallBack: LoadDM; '%p', '%p'\n",
                    ((LPLOADDMSTRUCT)pnlblk->rgchData)->lpDmName,
                    ((LPLOADDMSTRUCT)pnlblk->rgchData)->lpDmParams));
            assert(FDMSide);
            lds.lpDmName = (LPVOID)pnlblk->rgchData;
            lds.lpDmParams = (LPSTR)pnlblk->rgchData + strlen(lds.lpDmName) + 1;

            xosd = LoadDM(pnlblk->hpid, &lds);

            ZERO_Rgb(RgbReply);
            PnlblkRp->mtypeBlk = mtypeLoadDMReply;

            PnlblkRp->hpid = pnlblk->hpid;
            PnlblkRp->cchMessage = sizeof(XOSD);
            PnlblkRp->seq = ++pkSeq;

            memcpy((LPVOID)PnlblkRp->rgchData, (LPB) &xosd, sizeof(XOSD));
            DPRINT(("CallBack: LoadDM; replying with 0x%x\n", xosd));
            xosd = SendData(PnlblkRp, sizeof(NLBLK) + sizeof(XOSD));
            break;

        default:
            assert(FALSE);
    }

    return TRUE;
}