Exemple #1
0
void GaduProtocol::login()
{
    // TODO: create some kind of cleanup method
    if (GaduSession)
    {
        gg_free_session(GaduSession);
        GaduSession = 0;

        // here was return... do not re-add it ;)
    }

    if (SocketNotifiers)
    {
        SocketNotifiers->deleteLater();
        SocketNotifiers = 0;
    }

    auto accountData = GaduAccountData{account()};
    if (0 == accountData.uin())
    {
        connectionClosed();
        return;
    }

    GaduProxyHelper::setupProxy(
        account().useDefaultProxy() ? m_networkProxyManager->defaultProxy() : account().proxy());

    setupLoginParams();

    m_lastSentStatus = loginStatus();
    GaduSession = gg_login(&GaduLoginParams);

    cleanUpLoginParams();

    if (!GaduSession)
    {
        // gadu session can be null if DNS failed, we can try IP after that
        connectionError();
        return;
    }

    SocketNotifiers = new GaduProtocolSocketNotifiers(account(), this);
    SocketNotifiers->setGaduIMTokenService(CurrentImTokenService);
    SocketNotifiers->setGaduUserDataService(CurrentUserDataService);
    connectSocketNotifiersToServices();
    SocketNotifiers->watchFor(GaduSession);
}
int main()
{
    // integral
    same(false, false);
    diff(false, true);
    same('1', '1');
    diff('1', '2');
    same(static_cast<unsigned char>('1'), static_cast<unsigned char>('1'));
    diff(static_cast<unsigned char>('1'), static_cast<unsigned char>('2'));
    same(L'1', L'1');
    diff(L'1', L'2');
    same(u'1', u'1');
    diff(u'1', u'2');
    same(U'1', U'1');
    diff(U'1', U'2');
    same(static_cast<short>(1), static_cast<short>(1));
    diff(static_cast<short>(1), static_cast<short>(2));
    same(static_cast<unsigned short>(1), static_cast<unsigned short>(1));
    diff(static_cast<unsigned short>(1), static_cast<unsigned short>(2));
    same(1, 1);
    diff(1, 2);
    same(1u, 1u);
    diff(1u, 2u);
    same(1l, 1l);
    diff(1l, 2l);
    same(1ul, 1ul);
    diff(1ul, 2ul);
    same(1ll, 1ll);
    diff(1ll, 2ll);
    same(1ull, 1ull);
    diff(1ull, 2ull);

    // enum
    enum enums { enum1, enum2 };
    same(enum1, enum1);
    diff(enum1, enum2);

    // floating point
    checkFloatingPoint<float>();
    checkFloatingPoint<double>();
    checkFloatingPoint<long double>();

    // string
    same(std::string("hi"), std::string("hi"));
    diff(std::string("hi"), std::string("hj"));
    diff(std::string("hi"), std::string("hi2"));

    // bitset
    same(std::bitset<3>("101"), std::bitset<3>("101"));
    diff(std::bitset<3>("101"), std::bitset<3>("001"));
    diff(std::bitset<3>("101"), std::bitset<3>("111"));
    diff(std::bitset<3>("101"), std::bitset<3>("100"));

    // pair
    same(std::make_pair(1, '1'), std::make_pair(1, '1'));
    diff(std::make_pair(1, '1'), std::make_pair(2, '1'));
    diff(std::make_pair(1, '1'), std::make_pair(1, '2'));

    // tuple
    same(std::make_tuple(1, '1', 1.f), std::make_tuple(1, '1', 1.f));
    diff(std::make_tuple(1, '1', 1.f), std::make_tuple(2, '1', 1.f));
    diff(std::make_tuple(1, '1', 1.f), std::make_tuple(1, '2', 1.f));
    diff(std::make_tuple(1, '1', 1.f), std::make_tuple(1, '1', 2.f));

    // pointer
    int i1 = 1, i1b = 1, i2 = 2;
    int *pi1 = &i1, *pi1b = &i1b, * pi2 = &i2, * pin = nullptr;
    same(pi1, pi1);  // same addr
    same(pi1, pi1b); // diff addr, same value
    diff(pi1, pi2);  // diff addr, diff value
    same(pin, pin);  // nullptr, same
    diff(pin, pi1);  // nullptr, diff, avoid dereferenciation, first
    diff(pi1, pin);  // nullptr, diff, avoid dereferenciation, second

    std::unique_ptr<int> ui1(pi1), u2i1(pi1), ui1b(pi1b), ui2(pi2), uin(pin);
    same(ui1, ui1);
    same(ui1, u2i1); // diff object, same addr (even if it should not happen)
    same(ui1, ui1b);
    diff(ui1, ui2);
    same(uin, uin);
    diff(uin, ui1);
    diff(ui1, uin);
    ui1.release(); u2i1.release(); ui1b.release(); ui2.release(); uin.release();

    auto deleter = [](int *){};
    std::shared_ptr<int> si1(pi1, deleter), s2i1(pi1, deleter),
        si1b(pi1b, deleter), si2(pi2, deleter), sin(pin, deleter);
    same(si1, si1);
    same(si1, s2i1); // diff object, same addr (may happen since it is a shared_ptr)
    same(si1, si1b);
    diff(si1, si2);
    same(sin, sin);
    diff(sin, si1);
    diff(si1, sin);
    si1.reset(); s2i1.reset();
    si1b.reset(); si2.reset(); sin.reset();

    boost::shared_ptr<int> bsi1(pi1, deleter), bs2i1(pi1, deleter),
        bsi1b(pi1b, deleter), bsi2(pi2, deleter), bsin(pin, deleter);
    same(bsi1, bsi1);
    same(bsi1, bs2i1); // diff object, same addr (may happen since it is a shared_ptr)
    same(bsi1, bsi1b);
    diff(bsi1, bsi2);
    same(bsin, bsin);
    diff(bsin, bsi1);
    diff(bsi1, bsin);
    bsi1.reset(); bs2i1.reset();
    bsi1b.reset(); bsi2.reset(); bsin.reset();

    // C-style array
    int a123[] = {1, 2, 3}, a123b[] = {1, 2, 3}, a223[] = {2, 2, 3}, a133[] = {1, 3, 3}, a124[] = {1, 2, 4};
    same(a123, a123);
    same(a123, a123b);
    diff(a123, a223);
    diff(a123, a133);
    diff(a123, a124);
    same("hi", "hi");
    diff("hi", "hj");

    // array
    same(std::array<int, 3>{{1, 2, 3}}, std::array<int, 3>{{1, 2, 3}});
    diff(std::array<int, 3>{{1, 2, 3}}, std::array<int, 3>{{2, 2, 3}});
    diff(std::array<int, 3>{{1, 2, 3}}, std::array<int, 3>{{1, 3, 3}});
    diff(std::array<int, 3>{{1, 2, 3}}, std::array<int, 3>{{1, 2, 4}});

    // sequence
    checkSequence<std::vector<int>>();
    checkSequence<std::deque<int>>();
    checkSequence<std::forward_list<int>>();
    checkSequence<std::list<int>>();
    checkSequence<std::set<int>>();
    checkSequence<std::multiset<int>>();

    // mapping
    checkCommonMapping<std::map<int, int>>();

    // unordered mapping
    checkCommonMapping<std::unordered_map<int, int>>();

    return 0;
}
Exemple #3
0
/**
 * @brief:  状态机输入
 *
 * @return: < 0 退出事务
 */
int TransactionBase::OnEvent()
{
    FUNC_TRACE(uin_);

    // 取消定时器
    CancelTimeoutTimer();

    int ret = 0;
    TransactionReturn trans_ret = RETURN_EXIT;

    // 2012-06-15
    // 决定在这里加个异常扑捉,虽然不建议在代码中使用异常
    // 但是确实没有想到比异常更合适的办法
    // 因为子类是未知的,子类的实现也是未知的
    // 无法保证每一个实现都是严谨的
    //
    // 不过发生异常时是应该让程序继续呢还是果断退出?
    //
    try
    {
        switch (state_)
        {
            case STATE_AWAKE:
                {
                    trans_ret = OnAwake();
                    break;
                }
            case STATE_ACTIVE:
                {
                    trans_ret = OnActive();
                    break;
                }
            case STATE_TIMEOUT:
                {
                    trans_ret = OnTimeout();
                    break;
                }
            default:
                {
                    TNT_LOG_ERROR(0, uin_, "error state %u", state_);
                }
        }
    }
    catch (std::exception& e)
    {
        TNT_LOG_ERROR(0, uin_, "exception|0X%08X|%u|%u|%u|%s",
                      cmd_, id_, state_, phase_, e.what());

        // 让这个事务退出吧。。。
        trans_ret = RETURN_EXIT;
    }

    switch (trans_ret)
    {
        case RETURN_WAIT:
            {
                if (0 == timeout_timer_id_)
                {
                    //2013-08-19, jamey
                    //进入等待却又忘了设置时间, 还是让其退出吧
                    state_ = STATE_IDLE;

                    TNT_LOG_DEBUG(0, uin(), "no timer trans exit|%u|%u", id(), cmd());
                    TransactionMgrSigleton::get_mutable_instance().FreeTransaction(this);
                }
                else
                {
                    state_ = STATE_ACTIVE;
                }
                break;
            }
        case RETURN_CONTINUE:
            {
                state_ = STATE_ACTIVE;

                return OnEvent();
            }
        case RETURN_EXIT:
            {
                state_ = STATE_IDLE;

                TNT_LOG_DEBUG(0, uin(), "trans exit|%u|%u", id(), cmd());
                TransactionMgrSigleton::get_mutable_instance().FreeTransaction(this);
//                ret = -1;

                break;
            }
    }

    return ret;
}