00001 #ifndef SEARCHLOGS_H_ 00002 #define SEARCHLOGS_H_ 00003 00004 #include "LogRotation.h" 00005 #include "NetMgr.h" 00006 #include "td4types.h" 00007 // Inclusao da nova unidade NetInterface.h para permitir que a busca nos logs 00008 // use a nova implementacao do TCP. 00009 #include "NetInterface.h" 00010 00011 /** Diretorio em que serao armazenados temporariamente os resultados das 00012 * buscas nos servidores (de despacho e de armazenamento). */ 00013 const char* const SEARCHRESULTDIRECTORY = "searchlogs/"; 00014 00015 class CSearchLogs; 00016 00017 /** Nova estrutura usada para guardar as informacoes sobre uma busca (esta 00018 * estrutura e passada a callback que trata do resultado de uma busca). 00019 */ 00020 00021 struct SearchCallbackData 00022 { 00023 /** Ponteiro para a classe (usado pelas funcoes estaticas) */ 00024 CSearchLogs *SearchLogs; 00025 /**< Endereco IP do cliente (usada para enviar o resultado da busca ao 00026 * cliente). */ 00027 int ClientIP; 00028 /**< Porta UDP do cliente (usada para enviar o resultado da busca ao 00029 * cliente). */ 00030 int ClientPort; 00031 /**< Identificador usado ao enviar o comando ao cliente. */ 00032 int ReqId; 00033 /**< Identificador do arquivo de busca gerado. */ 00034 unsigned long long int ResultFileId; 00035 }; 00036 00037 /** Classe que permite executar e enviar buscas executadas em um objeto do tipo 00038 * CLogRotation. Usada pelos servidores (de gerenciamento e os de armazenamento) 00039 * para enviar os logs aos clientes. 00040 */ 00041 00042 class CSearchLogs 00043 { 00044 private: 00045 /** Variavel booleana que indica se a classe foi inicializada */ 00046 bool m_Initialized; 00047 /** Classe usada para fazermos as buscas nos logs do servidor. */ 00048 CLogRotation *m_LogRotation; 00049 /** Classe usada para enviar o arquivo de log ao cliente. */ 00050 NetMgr *m_NetMgr; 00051 /** Nova classe usada para enviar o arquivo de log ao cliente (com a 00052 * nova implementacao do TCP. */ 00053 CNetInterface *m_NetInterface; 00054 /** Diretorio em que os logs da busca serao armazenados. */ 00055 const char *m_LogsDirectory; 00056 /** Prefixo usado para os arquivos de busca. */ 00057 const char *m_SearchResultPrefix; 00058 /** Tamanho do bloco no sistema de arquivos do servidor. */ 00059 unsigned int m_BlockSize; 00060 /** 00061 * Funcao usada para retornar o nome do arquivo (com o caminho 00062 * completo), a partir do identificador passado como parametro). 00063 * @param SearchFileId identificador associado ao nome do arquivo. 00064 * @param SearchFileName Nome do arquivo associado ao identificador. 00065 * @return true se o nome foi obtido com sucesso ou false se algum 00066 * erro ocorreu. 00067 */ 00068 bool GetSearchFileName( unsigned long long int SearchFileId, 00069 char *SearchFileName ); 00070 /** 00071 * Nova funcao de callback chamada quando uma solicitacao de busca e 00072 * completada. 00073 * @param SearchFileName Nome do arquivo com o resultado da busca (se a 00074 * busca tiver sucesso). 00075 * @param StartTime Tempo inicial da busca (baseado no mesmo principio 00076 * da funcao time da biblioteca do C, isto e, o tempo em segundos desde 00077 * a Epoch (00:00:00 UTC, Janeiro 1 de 1970). 00078 * @param EndTime Tempo final da busca (usando o mesmo principio de 00079 * StartTime). 00080 * @param SearchResult resultado da busca: se igual a SEARCH_OK, a busca 00081 * teve sucesso, isto e, existem logs dentro da faixa de tempo dada pelo 00082 * intervalo [StartTime, EndTime]. Se for igual a SEARCH_FAILED, entao 00083 * nao existem logs no intervalo [StartTime, EndTime]. 00084 * @param callbackparam parametro dependende da implementacao passado a 00085 * callback. Para esta classe, e um ponteiro para uma estrutura do tipo 00086 * SearchCallbackData). 00087 */ 00088 static void SearchResutCallback( char *SearchFileName, time_t StartTime, 00089 time_t EndTime, int SearchResult, 00090 void *callbackparam ); 00091 /** 00092 * Nova funcao de callback chamada quando o comando enviado pelo 00093 * servidor ao cliente termina a sua execucao. 00094 * @param callbackparam ponteiro para quem executou o comando (no caso, 00095 * um ponteiro para a estrutura SearchCallbackData com as informacoes 00096 * do cliente relacionado ao comando). 00097 * @param result resultado da execucao do comando. Qualquer valor 00098 * diferente de S_OK indica um erro ao executar o comando. 00099 */ 00100 static void SearchCmdCallback( void *callbackparam, int result ); 00101 /** 00102 * Nova funcao de callback chamada quando a resposta do comando enviado 00103 * pelo servidor ao cliente termina a sua execucao. 00104 * @param callbackparam ponteiro para quem executou o comando (no caso, 00105 * um ponteiro para a estrutura SearchCallbackData com as informacoes 00106 * do cliente relacionado ao comando). 00107 * @param result resultado da execucao do comando. Qualquer valor 00108 * diferente de S_OK indica um erro ao executar o comando. 00109 */ 00110 static void SearchCmdResultCallback( void *callbackparam, int result ); 00111 /** 00112 * Nova funcao de callback chamada quando o bloco enviado pelo 00113 * servidor ao cliente (do arquivo com o resultado da busca) e 00114 * completamente enviado -com ou sem sucesso-). 00115 * @param callbackparam ponteiro para quem executou o envio do bloco (no 00116 * caso, um ponteiro para o buffer com o bloco, pois precisamos remover 00117 * este buffer). 00118 * @param result resultado do envio do bloco. Qualquer valor diferente 00119 * de S_OK indica um erro ao executar o comando. 00120 */ 00121 static void SearchBlockCallback( void *callbackparam, int result ); 00122 00123 public: 00124 /** 00125 * Construtor da classe, usado para ao criarmos um novo objeto do 00126 * tipo CSearchLogs usado para gerenciar as buscas. 00127 */ 00128 CSearchLogs(); 00129 /** 00130 * Destrutor da classe, usado quando o objeto for removido. 00131 */ 00132 virtual ~CSearchLogs(); 00133 /** 00134 * Funcao usada para inicializar o objeto da classe CSearchLogs 00135 * criado (somente poderemos usar as outras funcoes apos inicializar a 00136 * classe, pois em caso, contrario, todas retornarao o erro 00137 * ERROR_SEARCHLOGS + ERROR_NOT_INITIALIZED. 00138 * @param MyLogRotation ponteiro para o objeto do tipo CLogRotation 00139 * em que as buscas serao executadas. 00140 * @param MyNetMgr ponteiro para o objeto do tipo NetMgr usado para 00141 * enviar os resultados das buscas aos clientes. 00142 * @param SearchResultDirectory diretorio em que os logs do servidor 00143 * sao armazenados (os resultados da busca serao armazenados no 00144 * subdiretorio SEARCHRESULTDIRECTORY). 00145 * @param SearchResultPrefix prefixo usado nos arquivos com os 00146 * resultados da busca (isso e para diferenciar os arquivos do servidor 00147 * de gerenciamento e de armazenamento, caso estejam em uma mesma 00148 * maquina). 00149 * @param BlockSize tamanho do bloco no sistema de arquivos do servidor. 00150 * @param NetInterface novo parametro (opcional, para caso alguem tenha 00151 * usado a implementacao anterior da classe e nao tenha mudado o codigo) 00152 * com o ponteiro para o objeto do tipo NetInterface que implementa a 00153 * nova copia do TCP. 00154 * @return S_OK se nenhum erro ocorreu ou diferente de S_OK se algum 00155 * erro ocorreu (no momento, o unico erro e o de chamar Initialize 00156 * apois ja termos inicializado o objeto). 00157 */ 00158 virtual int Initialize( CLogRotation *MyLogRotation, NetMgr *MyNetMgr, 00159 const char *LogsDirectory, 00160 const char *SearchResultPrefix, 00161 unsigned int BlockSize, 00162 CNetInterface *NetInterface = NULL ); 00163 /** 00164 * Nova funcao para solicitar uma busca em um conjunto de logs de um 00165 * dos servidores. 00166 * @param StartTime Tempo inicial da busca (baseado no mesmo principio 00167 * da funcao time da biblioteca do C, isto e, o tempo em segundos desde 00168 * a Epoch (00:00:00 UTC, Janeiro 1 de 1970). 00169 * @param EndTime Tempo Final da busca (o mesmo princio do tempo 00170 * inicial dado acima). 00171 * @param ClientIPAddr endereco IP do cliente que fez a busca. 00172 * @param ClientPort porta (a UDP) usada por este cliente. 00173 * @param ReqId identificador que deve ser usado pelo servidor ao 00174 * enviar o resultado da busca. 00175 * @return S_OK se a solicitacao de busca foi inicializada com sucesso, 00176 * ou um valor diferente de S_OK se a solicitacao nao foi iniciada com 00177 * sucesso. No caso do fracasso, se o erro e ERROR_INVALID_METHOD, isso 00178 * naoindicara um erro e sim, que o servidor nao possui suporte para 00179 * fazer as buscas. 00180 */ 00181 virtual int SearchLogsRequest( time_t StartTime, time_t EndTime, 00182 u32 ClientIPAddr, u16 ClientPort, 00183 u32 ReqId ); 00184 /** 00185 * Nova funcao para ler um bloco do arquivo com os resultados da busca. 00186 * @param ClientIPAddr endereco IP do cliente que fez a busca. 00187 * @param ClientPort porta (a UDP) usada por este cliente. 00188 * @param ResultFileId valor usado para identificar o arquivo com o 00189 * resultado da busca no servidor, retornado quando recebemos a 00190 * informacao de que a busca foi feita com sucesso. 00191 * @param Block numero do bloco que desejamos obter. 00192 * @param ReqId identificador que deve ser usado pelo servidor ao 00193 * enviar o bloco do arquivo ao cliente. 00194 * @return S_OK se o pedido do bloco foi feito com sucesso, ou um valor 00195 * diferente de S_OK se o pedido nao foi feito com sucesso. 00196 */ 00197 virtual int SearchResultDataRequest( u32 ClientIPAddr, u16 ClientPort, 00198 u64 ResultFileId, u32 Block, 00199 u32 ReqId ); 00200 /** 00201 * Nova funcao para informar ao servidor que o arquivo com o resultado 00202 * da busca pode ser removido. 00203 * @param ResultFileId valor usado para identificar o arquivo com o 00204 * resultado da busca no servidor, retornado quando recebemos a 00205 * informacao de que a busca foi feita com sucesso. 00206 * @return S_OK se o pedido de remocao do arquivo foi feito com 00207 * sucesso, ou um valor diferente de S_OK se algum erro ocorreu. 00208 */ 00209 virtual int RemoveSearchResultFile( u64 ResultFileId ); 00210 /** 00211 * Funcao similar a SearchLogsRequest mas, ao inves de retornar o codigo 00212 * de erro, o envia ao cliente, usando a ReqId passada como parametro, 00213 * a partir de um comando especial (onde o tamanho do arquivo e 0 e o 00214 * identificador do arquivo e o codigo de erro). 00215 * @param StartTime Tempo inicial da busca (baseado no mesmo principio 00216 * da funcao time da biblioteca do C, isto e, o tempo em segundos desde 00217 * a Epoch (00:00:00 UTC, Janeiro 1 de 1970). 00218 * @param EndTime Tempo Final da busca (o mesmo princio do tempo 00219 * inicial dado acima). 00220 * @param ClientIPAddr endereco IP do cliente que fez a busca. 00221 * @param ClientPort porta (a UDP) usada por este cliente. 00222 * @param ReqId identificador que deve ser usado pelo servidor ao 00223 * enviar o resultado da busca. 00224 */ 00225 virtual void SearchLogsRequestSendError( time_t StartTime, 00226 time_t EndTime, 00227 u32 ClientIPAddr, 00228 u16 ClientPort, u32 ReqId ); 00229 /** 00230 * Funcao similar a SearchResultDataRequest mas, ao inves de retornar o 00231 * codigo de erro, o envia ao cliente, usando a ReqId passada como 00232 * parametro. 00233 * @param ClientIPAddr endereco IP do cliente que fez a busca. 00234 * @param ClientPort porta (a UDP) usada por este cliente. 00235 * @param ResultFileId valor usado para identificar o arquivo com o 00236 * resultado da busca no servidor, retornado quando recebemos a 00237 * informacao de que a busca foi feita com sucesso. 00238 * @param Block numero do bloco que desejamos obter. 00239 * @param ReqId identificador que deve ser usado pelo servidor ao 00240 * enviar o bloco do arquivo ao cliente. 00241 */ 00242 virtual void SearchResultDataRequestSendError( u32 ClientIPAddr, 00243 u16 ClientPort, 00244 u64 ResultFileId, 00245 u32 Block, u32 ReqId ); 00246 }; 00247 #endif /*SEARCHLOGS_H_*/