예제 #1
0
        private void OnSearchFilesResultReceived(object sender, SearchFilesEventArgs arg)
        {
            this.BeginInvoke((Action)(delegate
            {
                log.DebugFormat("OnSearchFilesResultReceived arg: {0}", arg.Response);

                MultiplePayloadFrameDecoded payload = arg.Response;
                //login + ARROBA_SEPARATOR + queryHash + ARROBA_SEPARATOR + Settings.GetInstance().GetProperty("server.name", "DEFAULT_SERVER");
                string[] destination = payload.Destination.Split('@');
                string responseHashQuery = destination[1];
                string serverName = destination[2];

                if (HashQuery.Equals(responseHashQuery)) //si es para la consulta actual, sino se descarta
                {
                    log.DebugFormat("LLegó un payload deresultado de busqueda del server: {0}, con datos{1}", serverName, payload.ToString());
                    if (payload.IsError)
                    {
                        log.Error(payload.Payload);
                        ClearResults();
                        MessageBox.Show(payload.Payload);
                        btnBuscar.Enabled = true;
                    }
                    else
                    {
                        lock (resultsByServer)
                        {
                            if (resultsByServer[serverName] == null)
                            {
                                resultsByServer[serverName] = new MultiplePayloadFrameDecoded[payload.PartsTotal];
                            }
                        }

                        resultsByServer[serverName][payload.PartsCurrent - 1] = payload;
                        if (payload.IsLastpart())
                        {
                            lock (this)
                            {
                                serversToProccess--;
                            }
                            StringBuilder filesSB = new StringBuilder();
                            lock (resultsByServer[serverName])
                            {
                                foreach (var item in resultsByServer[serverName])
                                {
                                    filesSB.Append(item.Payload);
                                }
                            }
                            string[] infoArr = filesSB.ToString().Split('|');
                            foreach (var fileStr in infoArr)
                            {
                                if (fileStr.Length > 0)//si tiene resultados
                                {
                                    FileObject file = FileObject.FromNetworkString(fileStr);
                                    file.Server = serverName;

                                    lock (searchResult)
                                    {
                                        searchResult.Add(file);
                                    }
                                }
                            }


                            lock (this)
                            {
                                if (serversToProccess < 1)
                                {
                                    log.DebugFormat("Estan todos los resultados de busquedas");
                                    ProcesarResults();
                                }
                            }
                        }
                        else
                        {
                            log.DebugFormat("No terminaron de llegar los resultados, set timeout de busqueda");
                        }
                    }
                }
                else
                {
                    log.DebugFormat("Descarto un payload de resultado de busqueda: {0}", payload.ToString());
                }
            }));
        }