//! Starts the socket thread void SocketThread::run() { std::string p_socketFile = ("/tmp/isis_qview_" + Application::UserName()).toAscii().data(); struct sockaddr_un p_socketName; p_socketName.sun_family = AF_UNIX; strcpy(p_socketName.sun_path, p_socketFile.c_str()); int p_socket; // Create a socket if((p_socket = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { std::string msg = "Unable to create socket"; std::cerr << msg << std::endl; remove(p_socketFile.c_str()); return; } // Setting a timeout didn't work for Mac, so we're using a non-blocking mode // instead. fcntl(p_socket, F_SETFL, O_NONBLOCK); // Bind the file to the socket int status = bind(p_socket, (struct sockaddr *)&p_socketName, sizeof(p_socketName)); if(status < 0) { std::string msg = "Unable to bind to socket [" + p_socketFile + "]"; std::cerr << msg << std::endl; remove(p_socketFile.c_str()); return; } // Set up to listen to the socket if(listen(p_socket, 5) < 0) { std::string msg = "Unable to listen to socket [" + p_socketFile + "]"; std::cerr << msg << std::endl; remove(p_socketFile.c_str()); return; } p_done = false; while(!p_done) { // Accept Socket socklen_t len = sizeof(&p_socketName); int childSocket = accept(p_socket, (struct sockaddr *)&p_socketName, &len); if (childSocket < 0) if (errno == EWOULDBLOCK) { msleep(100); continue; // probably timed out, we cant do anything about this anyways } // Receive Data int bytes; // This used to be char buf[1024*1024]; but when that line existed the // mac OS's would crash unpredictably, even when the code on that // line wasn't executed. QScopedPointer< char, QScopedPointerArrayDeleter<char> > buf( new char[1024*1024]); if((bytes = recv(childSocket, buf.data(), 1024 * 1024, 0)) < 0) { std::string msg = "Unable to read from socket [" + p_socketFile + "]"; std::cerr << msg << std::endl; remove(p_socketFile.c_str()); return; } // Push everything onto our string buffer IString buffer; for(int i = 0; i < bytes; i++) buffer += buf.data()[i]; while(buffer.size() > 0) { IString token = buffer.Token(" "); if(token == "raise") { emit focusApp(); } else emit newImage(token.c_str()); } }; }
void IsisMain() { colorOffset = 0; frameletLines.clear(); outputCubes.clear(); uveven = NULL; uvodd = NULL; viseven = NULL; visodd = NULL; ProcessImportPds p; Pvl pdsLab; UserInterface &ui = Application::GetUserInterface(); QString fromFile = ui.GetFileName("FROM"); flip = false;//ui.GetBoolean("FLIP"); p.SetPdsFile(fromFile, "", pdsLab); ValidateInputLabels(pdsLab); inputCubeLines = p.Lines(); lookupTable = Stretch(); // read the lut if the option is on if(ui.GetBoolean("UNLUT") && pdsLab["LRO:LOOKUP_TABLE_TYPE"][0] == "STORED") { PvlKeyword lutKeyword = pdsLab["LRO:LOOKUP_CONVERSION_TABLE"]; for(int i = 0; i < lutKeyword.size(); i ++) { IString lutPair = lutKeyword[i]; lutPair.ConvertWhiteSpace(); lutPair.Remove("() "); QString outValueMin = lutPair.Token(" ,").ToQt(); QString outValueMax = lutPair.Token(" ,").ToQt(); lookupTable.AddPair(i, (toDouble(outValueMin) + toDouble(outValueMax)) / 2.0); } } QString instModeId = pdsLab["INSTRUMENT_MODE_ID"]; // this will be used to convert num input lines to num output lines, // only changed for when both uv and vis exist (varying summing) double visOutputLineRatio = 1.0; double uvOutputLineRatio = 1.0; int numFilters = 0; if(ui.GetBoolean("COLOROFFSET")) { colorOffset = ui.GetInteger("COLOROFFSETSIZE"); } // Determine our band information based on // INSTRUMENT_MODE_ID - FILTER_NUMBER is // only going to be used for BW images if(instModeId == "COLOR") { numFilters = 7; frameletLines.push_back(4); frameletLines.push_back(4); frameletLines.push_back(14); frameletLines.push_back(14); frameletLines.push_back(14); frameletLines.push_back(14); frameletLines.push_back(14); uveven = new Cube(); uvodd = new Cube(); viseven = new Cube(); visodd = new Cube(); // 14 output lines (1 framelet) from 5vis/2uv lines visOutputLineRatio = 14.0 / (14.0 * 5.0 + 4.0 * 2.0); // 4 output lines (1 framelet) from 5vis/2uv lines uvOutputLineRatio = 4.0 / (14.0 * 5.0 + 4.0 * 2.0); } else if(instModeId == "VIS") { numFilters = 5; frameletLines.push_back(14); frameletLines.push_back(14); frameletLines.push_back(14); frameletLines.push_back(14); frameletLines.push_back(14); viseven = new Cube(); visodd = new Cube(); // 14 output lines (1 framelet) from 5vis/2uv lines visOutputLineRatio = 14.0 / (14.0 * 5.0); } else if(instModeId == "UV") { numFilters = 2; frameletLines.push_back(4); frameletLines.push_back(4); uveven = new Cube(); uvodd = new Cube(); // 4 output lines (1 framelet) from 2uv lines uvOutputLineRatio = 4.0 / (4.0 * 2.0); } else if(instModeId == "BW") { numFilters = 1; frameletLines.push_back(14); viseven = new Cube(); visodd = new Cube(); } padding.resize(numFilters); for(int filter = 0; filter < numFilters; filter++) { padding[filter] = (colorOffset * frameletLines[filter]) * filter; // dont count UV for VIS offsetting if(instModeId == "COLOR" && filter > 1) { padding[filter] -= 2 * colorOffset * frameletLines[filter]; } } FileName baseFileName(ui.GetFileName("TO")); if(uveven && uvodd) { // padding[1] is max padding for UV int numSamples = ((viseven) ? p.Samples() / 4 : p.Samples()); numSamples = 128; // UV is alway sum 4 so it is 128 samples int numLines = (int)(uvOutputLineRatio * inputCubeLines + 0.5) + padding[1]; int numBands = 2; uveven->setDimensions(numSamples, numLines, numBands); uveven->setPixelType(Isis::Real); QString filename = baseFileName.path() + "/" + baseFileName.baseName() + ".uv.even.cub"; uveven->create(filename); uvodd->setDimensions(numSamples, numLines, numBands); uvodd->setPixelType(Isis::Real); filename = baseFileName.path() + "/" + baseFileName.baseName() + ".uv.odd.cub"; uvodd->create(filename); } if(viseven && visodd) { // padding[size-1] is max padding for vis (padding[0] or padding[4] or padding[6]) int numSamples = p.Samples(); int numLines = (int)(visOutputLineRatio * inputCubeLines + 0.5) + padding[padding.size()-1]; int numBands = ((uveven) ? padding.size() - 2 : padding.size()); viseven->setDimensions(numSamples, numLines, numBands); viseven->setPixelType(Isis::Real); QString filename = baseFileName.path() + "/" + baseFileName.baseName() + ".vis.even.cub"; viseven->create(filename); visodd->setDimensions(numSamples, numLines, numBands); visodd->setPixelType(Isis::Real); filename = baseFileName.path() + "/" + baseFileName.baseName() + ".vis.odd.cub"; visodd->create(filename); } Pvl isis3VisEvenLab, isis3VisOddLab, isis3UvEvenLab, isis3UvOddLab; TranslateLabels(pdsLab, isis3VisEvenLab, isis3VisOddLab, isis3UvEvenLab, isis3UvOddLab); writeNullsToFile(); p.StartProcess(separateFramelets); p.EndProcess(); // Add original labels OriginalLabel origLabel(pdsLab); int numFramelets = padding.size(); PvlKeyword numFrameletsKeyword("NumFramelets", toString(numFramelets)); if(uveven) { for(int grp = 0; grp < isis3UvEvenLab.groups(); grp++) { uveven->putGroup(isis3UvEvenLab.group(grp)); } History history("IsisCube"); history.AddEntry(); uveven->write(history); uveven->write(origLabel); uveven->close(); delete uveven; uveven = NULL; } if(uvodd) { for(int grp = 0; grp < isis3UvOddLab.groups(); grp++) { uvodd->putGroup(isis3UvOddLab.group(grp)); } History history("IsisCube"); history.AddEntry(); uvodd->write(history); uvodd->write(origLabel); uvodd->close(); delete uvodd; uvodd = NULL; } if(viseven) { for(int grp = 0; grp < isis3VisEvenLab.groups(); grp++) { viseven->putGroup(isis3VisEvenLab.group(grp)); } History history("IsisCube"); history.AddEntry(); viseven->write(history); viseven->write(origLabel); viseven->close(); delete viseven; viseven = NULL; } if(visodd) { for(int grp = 0; grp < isis3VisOddLab.groups(); grp++) { visodd->putGroup(isis3VisOddLab.group(grp)); } History history("IsisCube"); history.AddEntry(); visodd->write(history); visodd->write(origLabel); visodd->close(); delete visodd; visodd = NULL; } }