// SessionManager must be read-locked Call::Call(SessionManager *_sManager, unsigned int _id, unsigned int _client, unsigned int _translator, string lang) : sManager(_sManager), id(_id), client(_client), translator(_translator), state(INIT), start_time(0), end_time(0), accounted(0), cost(0), price(0), client_balance(0) { pthread_mutex_init(&mutex, 0); Session *cs = sManager->findSessionByUser(_client); if (!cs) throw logic_error("Client session not found."); if (!dynamic_cast<Client *>(cs->getUser()) || (!TRANSLATORS_CALL && dynamic_cast<Translator *>(cs->getUser()))) throw logic_error("Client not found."); Client *c = dynamic_cast<Client *>(cs->getUser()); clientName = c->getName(); Session *ts = sManager->findSessionByUser(_translator); if (!ts) throw logic_error("Translator session not found."); Translator *t = dynamic_cast<Translator *>(ts->getUser()); if (!t) throw logic_error("Translator not found."); setTranslateLang(lang); setClientLang(t->getCommonLang(c)); price = t->getClientPrice(c, lang); translatorName = t->getName(); }