Página principal   Módulos   Lista de namespaces   Hierarquia de classes   Lista de componentes   Lista de ficheiros   Membros do namespace   Componentes membro   Ficheiros membro   Páginas relacionadas  

mensageiro.H

Ir para a documentação deste ficheiro.
00001 
00007 #ifndef IPC_MENSAGEIRO_H
00008 #define IPC_MENSAGEIRO_H
00009 
00010 #include <string>
00011 
00012 #include <Erros/erros.H>
00013 #include <Utilitarios/cadeia.H>
00014 
00015 extern "C" {
00016     #include <sys/msg.h>
00017     #include <sys/sem.h>
00018     #include <unistd.h>
00019     #include <pwd.h>
00020 }
00021 
00022 namespace IPC {
00023 
00034     class Erro : public Erros::Erro {
00035     public:
00038         Erro(std::string const& mensagem);
00039 
00042         Erro();
00043 
00044     private:
00045         std::string mensagem;
00046     };
00047 
00089     class Mensageiro {
00090     public:
00108         Mensageiro(key_t const chave = getuid());
00109 
00114         ~Mensageiro();
00115 
00123         std::string meuIdentificador() const;
00124 
00132         std::string identificadorDoOutro() const;
00133 
00143         void leMensagem();
00144 
00156         template <typename Tipo>
00157         Tipo const mensagemLida() const;
00158 
00168         template <typename Tipo>
00169         void envia(Tipo& mensagem) const;
00170 
00180         template <typename Tipo>
00181         void envia(Tipo const& mensagem) const;
00182 
00192         template <typename Char>
00193         void envia(Char*& mensagem) const;
00194 
00205         template <typename Char>
00206         void envia(Char const*& mensagem) const;
00207 
00217         template <typename Char>
00218         void envia(Char* const& mensagem) const;
00219 
00230         template <typename Char>
00231         void envia(Char const* const& mensagem) const;
00232 
00242         template <typename Char, int dimensao>
00243         inline void envia(Char const (& mensagem)[dimensao]) const;
00244 
00245     private:
00246         std::string tipo_dos_dados;
00247         std::string mensagem;
00248         int meu_PID;
00249         int PID_do_outro;
00250         int meu_UID;
00251         int UID_do_outro;
00252         int identificador_da_caixa_do_correio;
00253         int identificador_do_semaforo;
00254         bool sou_um_servidor;
00255         static bool existe_instancia;
00256 
00257         // Assim ninguém pode invocar o construtor por cópia...
00258         Mensageiro(Mensageiro const&);
00259 
00260         // ...nem a atribuição por cópia:
00261         Mensageiro& operator =(Mensageiro const&);
00262 
00263         // Lê uma mensagem consistindo num inteiro, sem verificação do tipo e
00264         // com ou sem espera, consoante o valor do argumento.  É uma rotina
00265         // dois em um, mas é usada apenas internamente.  O tipo é o tipo usado
00266         // para discriminar entre filas de espera da caixa do correio.
00267         int leBasicoInt(int const tipo, bool const deve_esperar = true) const;
00268 
00269         // Lê uma mensagem nua (i.e., lê uma cadeia de caracteres
00270         // directamente, sem interpretação), com ou sem espera, consoante o
00271         // valor do argumento.  É uma rotina dois em um, mas é usada apenas
00272         // internamente.  O tipo é o tipo usado para discriminar entre filas
00273         // de espera da caixa do correio.
00274         std::string leBasico(int const tipo, 
00275                              bool const deve_esperar = true) const;
00276 
00277         // Escreve uma mensagem consistindo simplemente num inteiro, sem
00278         // indicação do tipo.  O tipo é o tipo usado para discriminar entre
00279         // filas de espera da caixa do correio.
00280         void escreveBasicoInt(int const tipo, int const valor);
00281 
00282         // Escreve uma mensagem nua.  O tipo é o tipo usado para discriminar
00283         // entre filas de espera da caixa do correio.
00284         void escreveBasico(int const tipo, std::string const& mensagem) const;
00285 
00286         // Estabelece uma nova nova caixa do correio (ou liga-se a uma caixa
00287         // do correio existente).  Usa a chave IPC dada.
00288         void estabeleceCaixaDoCorreio(key_t const chave);
00289 
00290         // Remove a caixa do correio.
00291         void removeCaixaDoCorreio();
00292 
00293         // Estabelece o semáforo de acesso à caixa do correio (ou liga-se um
00294         // semáforo já existente).  Usa a chave IPC dada.
00295         void estabeleceSemaforoDeAcesso(key_t const chave);
00296 
00297         // Inicia um período de acesso exclusivo à caixa do correio.  Útil
00298         // durante o protocolo de início de conversação entre os mensageiros.
00299         void entraEmAcessoExclusivo() const;
00300 
00301         // Termina um período de acesso exclusivo à caixa do correio.  Útil
00302         // durante o protocolo de início de conversação entre os mensageiros.
00303         void saiDeAcessoExclusivo() const;
00304 
00312         bool cumpreInvariante() const;
00313     };
00314 }
00315 
00316 #include <IPC++/mensageiro_impl.H>
00317 
00318 #endif //IPC_MENSAGEIRO_H

Gerado em Tue Dec 3 15:19:35 2002 para Pacotes por doxygen1.3-rc1