/* * Copyright (C) 2004-2005 Vadim Berezniker * http://www.kryptolus.com * * This Program 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, or (at your option) * any later version. * * This Program 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 GNU Make; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * http://www.gnu.org/copyleft/gpl.html * */ #include "stdafx.h" #include "common.h" #include "krySubWriter.h" krySubWriter::krySubWriter(kryScript *script, char *filename) : m_event_after_last(NULL), m_script(script), m_event_filter(~0) { if(filename) this->m_filename = kry_strdup(filename); else this->m_filename = kry_strdup(script->GetFilename()); kryListIterator event_iter; script->GetEventIterator(&event_iter); while(kryEvent *event = event_iter.GetNext()) { if(event->GetType() == kryEvent::EVENT_BLANK) { if(!this->m_event_after_last) { this->m_event_after_last = event; } } else { this->m_event_after_last = NULL; } } script->GetEventIterator(&this->iter_event); } kryEventDetailed *krySubWriter::GetNextEvent() { for(;;) { kryEventDetailed *event = this->iter_event.GetNext(); if(!event || this->m_event_after_last && event == this->m_event_after_last) return NULL; if(!(event->GetType() & this->m_event_filter)) continue; return event; } } void krySubWriter::SetEventFilter(int filter) { this->m_event_filter = filter; } krySubWriter::~krySubWriter() { kry_free(this->m_filename); if(this->m_fh) fclose(this->m_fh); } gboolean krySubWriter::Open() { if(m_script->GetEncoding() == ENCODING_UTF16) m_fh = fopen(this->m_filename, "wb"); else m_fh = fopen(this->m_filename, "w"); if(!m_fh) return FALSE; return TRUE; } void krySubWriter::WriteHeaders() { if(m_script->GetEncoding() == ENCODING_UTF8) { unsigned char *buffer = (unsigned char *) kry_malloc(3); buffer[0] = 0xEF; buffer[1] = 0xBB; buffer[2] = 0xBF; fwrite((void *) buffer, 3, 1, m_fh); } if(m_script->GetEncoding() == ENCODING_UTF16) { unsigned char *buffer = (unsigned char *) kry_malloc(2); if(G_BYTE_ORDER == G_BIG_ENDIAN) { buffer[0] = 0xFE; buffer[1] = 0xFF; } else { buffer[0] = 0xFF; buffer[1] = 0xFE; } fwrite((void *) buffer, 2, 1, m_fh); } } void krySubWriter::WriteString(char *buffer) { fwrite_custom(buffer, strlen(buffer), 1, m_fh, m_script->GetEncoding() == ENCODING_UTF16); } kryScript *krySubWriter::GetScript() { return this->m_script; }