/* -*- 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 #include // For mkdir #include #include // For unlink #include // For errno #include // For inet_ntoa #include #include #include #include #include "miav_config.h" #include "mov_encoder_thread.h" #include "img_encoder.h" #include "server_status.h" #include "dv.h" #include "network.h" void newConnection(Socket *socket) { char cpr[256]; char clientip[64]; bool hasCpr = false; ServerStatus status; n_savestate savestate = LATER; n_header h; Frame *frame; Frame *freeze_frame = NULL; MovEncoderThread *enc = NULL; frame = new Frame(NULL, DVPACKAGE_SIZE); INFO(connection, "CONNECTION OPENED"); INFO(connection, "New connection (%s)", inet_ntoa(socket->socketaddr.sin_addr)); sprintf(clientip, "%s", inet_ntoa(socket->socketaddr.sin_addr)); Network network = Network(socket); while(int ret = network.recvPackage(&h, frame->data, frame->size)) { status.checkPoint(); if(ret == -1) { ERR(connection, "A network error ocurred, terminating session"); break; } frame->mute = h.header.h_data.mute; if(!hasCpr) { sprintf(cpr, "%s", h.header.h_data.cpr); hasCpr = true; } if(h.header.h_data.snapshot) { if(freeze_frame) { ImgEncoder(cpr).encode(freeze_frame, 100); delete freeze_frame; freeze_frame = NULL; } else { ImgEncoder(cpr).encode(frame, 100); } } if(h.header.h_data.savestate != NO_CHANGE) { savestate = h.header.h_data.savestate; INFO(connecion, "GOT SAVESTATE FROM NETWORK: %d", 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(clientip, cpr); enc->encode(frame); } frame = new Frame(NULL, DVPACKAGE_SIZE); } INFO(connection, "Closing connection..."); // No encoder exists, if this is a pure snapshot (image) connection. if(enc) { enc->setSaveState(savestate); // Send end of stream frame. frame->endOfFrameStream = true; enc->encode(frame); delete enc; } INFO(connection, "CONNECTION CLOSED"); }