00001 /* 00002 * Copyright (C) 2009, Edmundo Albuquerque de Souza e Silva. 00003 * 00004 * This file may be distributed under the terms of the Q Public License 00005 * as defined by Trolltech AS of Norway and appearing in the file 00006 * LICENSE.QPL included in the packaging of this file. 00007 * 00008 * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING 00009 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00010 * PURPOSE. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, 00011 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 00012 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 00013 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 00014 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 00015 * 00016 * Thanks: Jose Renato Santos 00017 * 00018 */ 00019 00020 #ifndef __SESSIONMANAGER_H_ 00021 #define __SESSIONMANAGER_H_ 00022 00023 #include "RioInterface.h" 00024 #include "RioTCP.h" 00025 #include "ObjectInfo.h" 00026 00027 #include <vector> 00028 00029 #ifndef WINDOWS 00030 #include <sys/time.h> 00031 #endif 00032 /* -------------------------------- */ 00033 00034 class CSessionManager 00035 { 00036 public: 00037 CSessionManager(CRioTCP* TCPconnection); 00038 ~CSessionManager(); 00039 HRESULT Open(/*[string][in]*/ const char* Username, 00040 /*[string][in]*/ const char* Password, 00041 /*[out]*/ RioSessionId *Session); 00042 HRESULT Close(/*[in]*/ const RioSessionId Session); 00043 HRESULT OpenStream( const RioSessionId Session, 00044 const RioStreamTraffic *Traffic, 00045 RioStreamId *Stream, 00046 int *MaxRequests ); 00047 00048 HRESULT CreateObject( /*[in]*/ const RioSessionId Session, 00049 /*[string][in]*/ const char* ObjectName, 00050 /*[in]*/ const short Type); 00051 00052 HRESULT DeleteObject(/*[in]*/ const RioSessionId Session, 00053 /*[string][in]*/ const char* ObjectName); 00054 HRESULT RenameObject(/*[in]*/ const RioSessionId Session, 00055 /*[string][in]*/ const char* CurrentName, 00056 /*[string][in]*/ const char* NewName); 00057 HRESULT GetBlockSize(/*[in]*/ const RioSessionId Session, 00058 /*[out]*/ unsigned int *BlockSize); 00059 HRESULT GetnStorageNodes(/*[in]*/ const RioSessionId Session, 00060 /*[out]*/ short *nStorageNodes); 00061 HRESULT FirstObject (/*[in]*/ RioSessionId Session, 00062 /*[string][in]*/ signed char* DirectoryName, 00063 /*[out]*/ ObjectHandle* Handle, 00064 /*[out]*/ int* IsDirectory, 00065 /*[in]*/ int BufferSize, 00066 /*[out,size_is(BufferSize)]*/signed char* ObjectName); 00067 HRESULT ChangeDir (/*[in]*/ RioSessionId Session, 00068 /*[in][string]*/ signed char *Dir); 00069 HRESULT GetCurrentDir (/*[in]*/ RioSessionId Session, 00070 /*[in]*/ int size, 00071 /*[out,size_is(size)]*/ signed char *Dir); 00072 HRESULT GetObjectInfo (/*[in]*/ RioSessionId Session, 00073 /*[in]*/ const char* ObjectName, 00074 /*[out]*/ ObjectInfo* ObjectInfo); 00075 HRESULT GetNumberOfDisks( /*{in}*/ const RioSessionId Session, 00076 /*{out}*/ unsigned int *NumberOfDisks); 00077 HRESULT GetNumberOfStorageNodes( /*{in}*/ const RioSessionId Session, 00078 /*{out}*/ unsigned int *NumberOfStorageNodes); 00079 HRESULT GetStorageNodeInfo (/*in*/ RioSessionId Session, 00080 /*out*/ RioStorageNodeInfo* StorageNodeInfo, 00081 /*in*/ unsigned int StorageNodeIndex ); 00082 HRESULT SendNATMappings (/*in*/ int *addrs, 00083 /*in*/ int *ports, 00084 /*in*/ unsigned int size ); 00085 HRESULT GetMonitorTable (/*in*/ char *UserName, 00086 /*out*/ vector<ClientData> *client_data, 00087 /*out*/ vector<StorageData> *storage_data ); 00088 HRESULT GetNumberOfActiveAndMaxSessions(/*in*/const RioSessionId Session, 00089 /*out*/ unsigned int *NumberOfActiveSessions, 00090 /*out*/ unsigned int *NumberOfMaxSessions); 00091 00092 HRESULT SaveMeasures( const RioSessionId Session ); 00093 00094 #ifdef WINDOWS 00095 HRESULT GetRTT( struct _SYSTEMTIME *RTT_openConnection, 00096 struct _SYSTEMTIME *RTT_openStream); 00097 HRESULT GetAverageRTT( struct _SYSTEMTIME *average_RTT ); 00098 #else 00099 HRESULT GetRTT( struct timeval *RTT_openConnection, 00100 struct timeval *RTT_openStream); 00101 HRESULT GetAverageRTT( struct timeval *average_RTT ); 00102 #endif 00103 00104 /** 00105 * Esta funcao faz uma chamada remota a um procedimento do Servidor RIO 00106 * para obter todos os pares IP, porta para os quais precisaremos enviar 00107 * periodicamente mensagens Fake para garantir que os enderecos associados 00108 * ao mapeamento continuarao validos. 00109 * Nota: esta funcao foi baseada na funcao Open da classe. 00110 * @param ServerAddress ponteiro para um ponteiro para um vetor que contera 00111 * os enderecos (pares IP, porta) do Rio Server e dos Storage Servers. 00112 * @param ServerAddressSize ponteiro para a variavel que armazenara o tamanho 00113 * deste vetor com os enderecos. 00114 * @return S_OK se os enderecos foram obtidos com sucesso, e um valor de erro 00115 * diferente de S_OK caso nao tenha sido possivel obter os enderecos. 00116 */ 00117 HRESULT GetServerAddress( struct sockaddr_in **ServerAddress, 00118 unsigned int *ServerAddressSize); 00119 /** 00120 * Esta funcao faz uma chamada remota a um procedimento do Servidor RIO 00121 * para verificar se a versao do servidor suporta o controle de fluxo. 00122 * @param IsImplemented ponteiro para um valor booleano que sera, apos a 00123 * execucao da funcao, igual a true se a versao do servidor suporta o controle 00124 * de fluxo, e false caso nao suporte o controle ou se algum outro erro 00125 * (diferente do de metodo invalido) ocorreu ao fazer a chamada remota (neste 00126 * caso, o retorno indicara o erro). 00127 * @return S_OK se a chamada foi executada com sucesso (o erro de metodo 00128 * invalido e usado para detectar se o servidor usa ou nao o controle de fluxo 00129 * e nao e considerado aqui como um erro). 00130 */ 00131 HRESULT CheckStreamControl( bool *IsImplemented ); 00132 /** 00133 * Nova funcao para solicitar uma busca em um conjunto de logs de um 00134 * dos servidores. 00135 * @param SearchType tipo da busca, que por enquanto, pode ser 00136 * SEARCHINTRAFFICLOGS para fazer busca nos logs com os trafegos de um 00137 * dos servidores de armazenamento, ou SEARCHINCLIENTSLOGS para fazer 00138 * uma busca nos logs com os comportamentos dos clientes do servidor de 00139 * despacho. 00140 * @param StartTime Tempo inicial da busca (baseado no mesmo principio 00141 * da funcao time da biblioteca do C, isto e, o tempo em segundos desde 00142 * a Epoch (00:00:00 UTC, Janeiro 1 de 1970). 00143 * @param EndTime Tempo Final da busca (o mesmo princio do tempo 00144 * inicial dado acima). 00145 * @param ServerIp endereco IP do servidor. 00146 * @param ServerPort porta (a UDP) usada por este servidor. 00147 * @param ClientIp endereco IP do cliente. 00148 * @param ClientPort porta (a UDP) usada por este cliente. 00149 * @param ReqId identificador que deve ser usado pelo servidor ao 00150 * enviar o resultado da busca. 00151 * @return S_OK se a solicitacao de busca foi inicializada com sucesso, 00152 * ou um valor diferente de S_OK se a solicitacao nao foi iniciada com 00153 * sucesso. No caso do fracasso, se o erro e ERROR_INVALID_METHOD, isso 00154 * naoindicara um erro e sim, que o servidor nao possui suporte para 00155 * fazer as buscas. 00156 */ 00157 HRESULT SearchLogsRequest( unsigned int SearchType, time_t StartTime, 00158 time_t EndTime, int ServerIP, int ServerPort, 00159 int ClientIP, int ClientPort, int ReqId ); 00160 /** 00161 * Nova funcao para ler um bloco do arquivo com os resultados da busca. 00162 * @param ServerIp endereco IP do servidor. 00163 * @param ServerPort porta (a UDP) usada por este servidor. 00164 * @param ClientIp endereco IP do cliente. 00165 * @param ClientPort porta (a UDP) usada por este cliente. 00166 * @param ResultFileId valor usado para identificar o arquivo com o 00167 * resultado da busca no servidor, retornado quando recebemos a 00168 * informacao de que a busca foi feita com sucesso. 00169 * @param Block numero do bloco que desejamos obter. 00170 * @param ReqId identificador que deve ser usado pelo servidor ao 00171 * enviar o bloco do arquivo ao cliente. 00172 * @return S_OK se o pedido do bloco foi feito com sucesso, ou um valor 00173 * diferente de S_OK se o pedido nao foi feito com sucesso. 00174 */ 00175 HRESULT ResultFileBlockRequest( int ServerIP, int ServerPort, 00176 int ClientIP, int ClientPort, 00177 unsigned long long int ResultFileId, 00178 unsigned int Block, int ReqId ); 00179 /** 00180 * Nova funcao para informar ao servidor que o arquivo com o resultado 00181 * da busca pode ser removido. 00182 * @param ServerIp endereco IP do servidor. 00183 * @param ServerPort porta (a UDP) usada por este servidor. 00184 * @param ResultFileId valor usado para identificar o arquivo com o 00185 * resultado da busca no servidor, retornado quando recebemos a 00186 * informacao de que a busca foi feita com sucesso. 00187 * @return S_OK se o pedido de remocao do arquivo foi feito com 00188 * sucesso, ou um valor diferente de S_OK se algum erro ocorreu. 00189 */ 00190 HRESULT RemoveResultFile( int ServerIP, int ServerPort, 00191 unsigned long long int ResultFileId ); 00192 00193 // Novas funcoes para criar/remover e alterar as senhas dos usuarios. 00194 00195 /** 00196 * Nova funcao para criar um usuario. 00197 * @param UserName ponteiro para a string com o nome do usuario. 00198 * @param Password ponteiro para a string com a senha do usuario. 00199 * @return S_OK se o usuario foi criado com sucesso ou um valor 00200 * diferente de S_OK se algum erro ocorreu ao fazermos a chamada remota. 00201 */ 00202 HRESULT CreateUser( char *UserName, char *Password ); 00203 00204 /** 00205 * Nova funcao para remover a senha do usuario. 00206 * 00207 * Obs: devido ao servidor nao fazrer uma remocao do diretorio se ele 00208 * nao estiver vazio, o diretorio do usuario nao sera removido. 00209 * 00210 * @param UserName ponteiro para a string com o nome do usuario. 00211 * @return S_OK se o usuario foi criado com sucesso ou um valor 00212 * diferente de S_OK se algum erro ocorreu ao fazermos a chamada remota. 00213 */ 00214 HRESULT RemoveUser( char *UserName ); 00215 00216 /** 00217 * Nova funcao para alterar a senha de um usuario. 00218 * @param UserName ponteiro para a string com o nome do usuario. 00219 * @param Password ponteiro para a string com a senha do usuario. 00220 * @return S_OK se o usuario foi criado com sucesso ou um valor 00221 * diferente de S_OK se algum erro ocorreu ao fazermos a chamada remota. 00222 */ 00223 HRESULT ChangePassword( char *UserName, char *Password ); 00224 00225 /** 00226 * Nova funcao para obter a lista com todos os usuarios. 00227 * @param USerList vetor de strings (STL) no qual a lista de usuarios 00228 * sera armazenada. 00229 * @return S_OK caso a lista tenha sido gerada com sucesso ou o codigo 00230 * de erro caso nao tenha sido possivel gerar a lista. 00231 */ 00232 HRESULT GetUserList( vector< string > &UserList ); 00233 00234 private: 00235 CRioTCP* m_TCPconnection; 00236 #ifdef WINDOWS 00237 struct _SYSTEMTIME m_RTT_openConnection, m_RTT_openStream; 00238 #else 00239 struct timeval m_RTT_openConnection, m_RTT_openStream; 00240 #endif 00241 }; 00242 00243 #endif // __SESSIONMANAGER_H_ 00244