/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * server.cc * * Mon Nov 8 11:35:01 CET 2004 * Copyright 2004 Bent Bisballe * deva@aasimon.org ****************************************************************************/ /* * This file is part of MIaV. * * MIaV is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MIaV is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MIaV; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "server.h" #include "miav.h" #include #include // For mkdir #include #include // For unlink #include // For errno #include // For inet_ntoa #include #include #include #include "miav_config.h" #include "mov_encoder_thread.h" #include "img_encoder.h" #include "server_status.h" #include "dv.h" void newConnection(Socket *socket, Info *info) { char cpr[256]; bool hasCpr = false; ServerStatus status(info); n_savestate savestate = LATER; n_header h; Frame *frame; Frame *freeze_frame = NULL; MovEncoderThread *enc = NULL; frame = new Frame(NULL, DVPACKAGE_SIZE); info->info("CONNECTION OPENED"); info->info("New connection (%s)", inet_ntoa(socket->socketaddr.sin_addr)); Network network = Network(socket, info); while(int ret = network.recvPackage(&h, frame->data, frame->size)) { status.checkPoint(); if(ret == -1) { info->error("A network error ocurred, terminating session"); break; } if(!hasCpr) { sprintf(cpr, h.header.h_data.cpr); hasCpr = true; } if(h.header.h_data.snapshot) { if(freeze_frame) { ImgEncoder(cpr, info).encode(freeze_frame, 100); delete freeze_frame; freeze_frame = NULL; } else { ImgEncoder(cpr, info).encode(frame, 100); } } if(h.header.h_data.savestate) { savestate = h.header.h_data.savestate; } if(h.header.h_data.freeze) { if(freeze_frame) delete freeze_frame; // copy the frame into another temporary one. freeze_frame = new Frame(frame->data, frame->size); } // This one must be last! if(h.header.h_data.record) { // if(!enc) enc = newMovEncoder(cpr); if(!enc) enc = new MovEncoderThread(cpr, info); enc->encode(frame); } frame = new Frame(NULL, DVPACKAGE_SIZE); } // TODO: Use save state info->info("Closing connection..."); // Send end of stream frame. frame->endOfFrameStream = true; enc->encode(frame); if(enc) delete enc; info->info("CONNECTION CLOSED"); }