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; }
/** * @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; }