Я пытаюсь создать приложение CORBA, которое имеет следующий интерфейс IDL:
module Chat {
exception SesionNoIniciada{};
exception UsuarioNoRegistrado{};
exception ErrorServidor{};
exception SesionYaIniciada{};
interface Cliente{
readonly attribute string nombre;
oneway void nuevaSolicitudDeAmistad(in string c); //devuelve void, parametro string/char*
oneway void actualizarListaAmigos();
oneway void nuevoMensaje(in Cliente usuario, in string men);
};
typedef sequence<string> nombres;
typedef sequence<Cliente> clientes;
interface Servidor{
nombres iniciarSesion(in Cliente usuario, in string pass) raises (UsuarioNoRegistrado, SesionYaIniciada);
void cerrarSesion(in Cliente usuario, in string pass) raises (SesionNoIniciada);
nombres getUsuariosRegistrados(in Cliente usuario, in string pass, in string nombre) raises (SesionNoIniciada);
nombres getAmigos(in Cliente usuario, in string pass) raises (SesionNoIniciada);
clientes getAmigosConectados(in Cliente usuario, in string pass) raises (SesionNoIniciada);
void nuevaSolicitudDeAmistad(in Cliente amigo1, in string pass, in string amigo2) raises (UsuarioNoRegistrado, SesionNoIniciada);
void aceptarSolicitudDeAmistad(in Cliente amigo1, in string pass, in string amigo2) raises (UsuarioNoRegistrado, SesionNoIniciada);
void rechazarSolicitudDeAmistad(in Cliente amigo1, in string pass, in string amigo2) raises (UsuarioNoRegistrado, SesionNoIniciada);
void eliminarAmistad(in Cliente amigo1, in string pass, in string amigo2) raises (UsuarioNoRegistrado, SesionNoIniciada);
};
};
Следующий метод дает мне ошибку сегментации в обратной линии:
nombres* Servidor_i::getAmigos(Cliente_ptr usuario, const char* pass){
vector<string> aux;
nombres_var result;
Cliente_ptr cliente;
try{
aux=bd.listarAmigos(usuario->nombre()); //Gets names from DB (currently 0)
result = new nombres(aux.size());
for(int i=0; i<aux.size(); i++) //This for is not being executed, since size is 0
result[i] = aux.at(i).c_str();
} catch(ErrorBD& e){
throw ErrorServidor();
}
cout << "Ending" << endl;
return result._retn();
}
Я думаю, что это будет связано с динамическим освобождением памяти, но я еще не привык к CORBA, поэтому я не уверен, правильно ли использую типы данных.
Поскольку мне было невозможно выяснить, что не так с моим кодом, и создать ошибку сегментации, о которой я говорил; Я подумал об альтернативном способе решения моей проблемы: я перестроил интерфейс IDL, чтобы функция имела параметр "out", который позволяет мне возвращать последовательность без каких-либо проблем.