Пример #1
0
bool send_rpc(ErlTerm *t, MailBox *mailbox)
    throw(EpiException)
{
    std::cout << "Sending RPC: reply_server:print(" <<
            t->toString() << ")\n";

    ErlTermPtr<ErlConsList> list = new ErlConsList(t);

    mailbox->sendRPC(REMOTENODE, "reply_server", "print", list.get());

    std::cout << "Sent. Receiving response:\n";

    ErlTermPtr<ErlTerm> t2(mailbox->receiveRPC());


    std::cout << "Got term: " << t2->toString() << "\n";

    bool equals = t->equals(*t2);
    if (equals) {
        std::cout << "Equals, ok" << "\n";
    } else {
        std::cout << "Not equals, error!" << "\n";
    }
    return equals;
}
Пример #2
0
void MailBox::sendRPC( const std::string nodename,
                       const std::string mod,
                       const std::string fun,
                       ErlList* args )
        throw ( EpiBadArgument, EpiInvalidTerm,
                EpiEncodeException, EpiConnectionException )
{
    ErlTerm* inner_terms[] = {
        new ErlAtom("call"),
        new ErlAtom(mod.c_str()),
        new ErlAtom(fun.c_str()),
        args,
        new ErlAtom("user")
    };
    ErlTermPtr<ErlTerm> execTuple =
            new ErlTuple(self(), new ErlTuple(inner_terms, 5));
    std::auto_ptr<OutputBuffer> buffer(mSender->newOutputBuffer());
    buffer->writeTerm(execTuple.get());
    sendBuf(nodename, "rex", buffer.get());
}
Пример #3
0
bool test_connect(LocalNode &node)
        throw (EpiException)
{

    std::cout << "Testing connect to a node with a reply server\n";

    std::cout << "Connecting to " << REMOTENODE << "\n";

    std::auto_ptr<Connection> connection(node.connect(REMOTENODE));
    std::auto_ptr<MailBox> mailbox(node.createMailBox(connection.get()));
    connection->start();

    bool ret=true;
    ErlTermPtr<ErlTerm> *test_set = create_test_set();
    ErlTermPtr<ErlTerm> *p = test_set;
    /*

    std::cout << "Testing send and receive data\n";
    while(p->get()) {
        if (!send_reply_server(p->get(), mailbox.get())) {
            ret = false;
            break;
        }
        p++;
    }
    */
    std::cout << "Testing pattern Matching\n";
    ErlTermPtr<ErlTerm> hellomoon(new ErlTuple(new ErlAtom("hello"), new ErlAtom("moon")));
    ErlTermPtr<ErlTerm> helloworld(new ErlTuple(new ErlAtom("hello"), new ErlAtom("world")));
    ErlTermPtr<ErlTerm> hellocat(new ErlTuple(new ErlAtom("hello"), new ErlAtom("cat")));
    ErlTermPtr<ErlTerm> hellodog(new ErlTuple(new ErlAtom("hello"), new ErlAtom("dog")));
    ErlTermPtr<ErlTerm> varmoon(new ErlTuple(new ErlVariable(), new ErlAtom("moon")));
    ErlTermPtr<ErlTerm> varworld(new ErlTuple(new ErlVariable(), new ErlAtom("world")));
    ErlTermPtr<ErlTerm> varcat(new ErlTuple(new ErlVariable("X"), new ErlAtom("cat")));
    ErlTermPtr<ErlTerm> vardog(new ErlTuple(new ErlVariable(), new ErlAtom("dog")));
    mailbox->send("reply_server", new ErlTuple(mailbox->self(), hellomoon.get()));
    mailbox->send("reply_server", new ErlTuple(mailbox->self(), helloworld.get()));
    mailbox->send("reply_server", new ErlTuple(mailbox->self(), hellocat.get()));
    mailbox->send("reply_server", new ErlTuple(mailbox->self(), hellodog.get()));

    ErlTermPtr<ErlTerm> received_pattern;
    received_pattern.reset(mailbox->receive(varworld.get()));
    std::cout << "Pattern matched: " << received_pattern->toString() << "\n";
    received_pattern.reset(mailbox->receive(vardog.get()));
    std::cout << "Pattern matched: " << received_pattern->toString() << "\n";
    received_pattern.reset(mailbox->receive(varmoon.get()));
    std::cout << "Pattern matched: " << received_pattern->toString() << "\n";


    ComposedGuard *guard = new ComposedGuard();
    guard->addGuard(new MatchingCommandGuard(vardog.get(), new TestCommand1()));
    guard->addGuard(new MatchingCommandGuard(varcat.get(), new TestCommand2()));

    std::auto_ptr<ErlangMessage> a_msg(mailbox->receive(guard));
    std::cout << "Pattern matched: " << a_msg->getMsg()->toString() << "\n";

    std::cout << "Testing rpc calls\n";
    p = test_set;
    while(p->get()) {
        if (!send_rpc(p->get(), mailbox.get())) {
            ret = false;
            break;
        }
        p++;
    }

    delete [] test_set;

    return ret;
}
Пример #4
0
 inline ErlTermPtr<T>(const ErlTermPtr<U>& rhs):
         mErlTerm(rhs.addRef())
 {
     Dout(dc::erlang_memory, "["<<mErlTerm<<"]"<<"  \\- ErlTermPtr copy");
 }