Example #1
0
///////////////////////////////////////////////////////////////////////////////
//
// Convert
//
// Cette methode convertit une notice en une autre conformement au fichier de
// transco charg‰
//
///////////////////////////////////////////////////////////////////////////////
int TTransFile::Convert( TMarcRecord* MarcIn, TMarcRecord* MarcOut )
{
    TMarcField* In;
    TMarcField* Out;

    // On commence par effectuer la recopie (sans transco) du label
    MarcOut->SetLeader(MarcIn->GetLeader());
    if (!MarcOut->GetLeader())
    {
        typestr tmp = "Leader '";
        tmp += MarcIn->GetLeader();
        tmp += '\'';
        mStateManager->SetErrorD(3000, ERROR, tmp.str());
    }

    // On transcode ensuite chaque champ
    In=MarcIn->GetFirstField();
    Out=MarcOut->GetFirstField();
    while( In!=NULL )
    {
        // On cree un nouveau champ en sortie
        if (Out==NULL)
        {
            MarcOut->SetFirstField(new TMarcField);
            Out=MarcOut->GetFirstField();
        }
        else
        {
            Out->SetNextField(new TMarcField);
            Out=Out->GetNextField();
        }

        // On recopie le tag et les indicateurs du champ en entree
        Out->SetTag(In->GetTag());
        Out->SetIndicators(In->GetIndicators());

        // On transcode le libelle
        typestr result;
        Transcode(In->GetLib1(), result, In->GetLib1(), In->GetTag());
        Out->SetLib1(result.str());
        Transcode(In->GetLib2(), result, In->GetLib2(), In->GetTag());
        Out->SetLib2(result.str());
        Out->SetScript(In->GetScript());
        if (!Out->GetLib1())
        {
            typestr tmp = "Field ";
            tmp += In->GetTag();
            tmp += ": '";
            tmp += In->GetLib1() ? In->GetLib1() : "";
            tmp += '\'';
            mStateManager->SetErrorD(5006, ERROR, tmp.str());
        }

        // On passe au champ suivant
        In=In->GetNextField();
    }

    return mStateManager->GetErrorCode();
}
//-------------------------------------------------------------------
//  EncodeToFile
//        
//  Builds the transcode topology based on the input source,
//  configured transcode profile, and the output container settings.  
//-------------------------------------------------------------------
HRESULT CTranscoder::EncodeToFile(const WCHAR *sURL)
{
    assert (m_pSession);
    assert (m_pSource);
    assert (m_pProfile);
    
    if (!sURL)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = S_OK;

    //Create the transcode topology
    hr = MFCreateTranscodeTopology( m_pSource, sURL, m_pProfile, &m_pTopology );

    // Set the topology on the media session.
    if (SUCCEEDED(hr))
    {
        hr = m_pSession->SetTopology(0, m_pTopology);
    }
    
    //Get media session events. This will start the encoding session.
    if (SUCCEEDED(hr))
    {
        hr = Transcode();
    }

    return hr;
}
Example #3
0
int main(int argc, char* argv[])
{
	// the "service name" reported on the tape messages uses CONFIG.m_serviceName
	// which also defaults to orkaudio-[hostname] but can be different depending on the 
	// value set in config.xml
	char hostname[40];
	ACE_OS::hostname(hostname, 40);
	CStdString serviceName = CStdString("orkaudio-") + hostname;
	Daemon::Initialize(serviceName, MainThread, StopHandler);

	CStdString argument = argv[1];
	if (argc>1)
	{
		if(argument.CompareNoCase("version") == 0)
		{
			printf("Version my 2\n\n");
		}
		if (argument.CompareNoCase("debug") == 0)
		{
			MainThread();
		}
		else if (argument.CompareNoCase("transcode") == 0)
		{
			if(argc == 3)
			{
				Daemon::Singleton()->SetShortLived();
				CStdString file = argv[2];
				Transcode(file);
			}
			else
			{
				printf("Please specify file to transcode\n\n");
			}
		}
		else if (argument.CompareNoCase("install") == 0)
		{
			Daemon::Singleton()->Install();
		}
		else if  (argument.CompareNoCase("uninstall") == 0)
		{
			Daemon::Singleton()->Uninstall();
		}
		else
		{
#ifdef WIN32
	printf("Argument incorrect. Possibilies are:\ninstall: install NT service\nuninstall: uninstall NT service\ntranscode <file>: convert .mcf file to storage format specified in config.xml\n\n");
#else
	printf("Argument incorrect. Possibilies are:\ndebug: run attached to tty\ntranscode <file>: convert .mcf file to storage format specified in config.xml\n\n");
#endif
		}
	}
	else
	{
		// No arguments, launch the daemon
		printf("Starting orkaudio daemon ... (type 'orkaudio debug' if you prefer running attached to tty)\n");
		Daemon::Singleton()->Start();		
	}
	return 0;
}
Example #4
0
static PyObject *ToBinary(PyObject *self, PyObject *args) {
	const char *szDest;
	const char *szOriginalName;
	PyObject *pFile;
	if (!PyArg_ParseTuple(args, "Oss", &pFile, &szDest, &szOriginalName)) {
		return NULL;
	}
	State state(szDest, szOriginalName);
	int fd = fileno(PyFile_AsFile(pFile));
	lseek(fd, 0, SEEK_SET);
	Transcode(fd, &state);
	return Py_BuildValue("i", FILETYPE_MZML);
}
Example #5
0
// Unfortunately, first parameter needs to be non-const because iconv() takes the inbuf as non-const char**
int Transcode(char* src, int srcBytes, char* dest, int destBytes, Encoding srcEnc, Encoding destEnc)
{
	if (srcEnc == None) {
		return ERR_INVALID_PARAMETER;
	}
	if (srcEnc == destEnc  ||  destEnc == None) {
		// If we have the same encoding in src and dest, we will just copy.
		int len = srcBytes < destBytes ? srcBytes : destBytes;
		memcpy(dest, src, len);

		if (srcBytes > destBytes) {
			return ERR_INSUFFICIENT_BUFFER;
		}

		return len;
	}

	if (srcEnc == GXT8) {
		// GXT8 -> destEnc conversion is done by converting to ISO-8859-1 first and then to destEnc.
		unsigned char* tmp = new unsigned char[destBytes];
		int len = srcBytes < destBytes ? srcBytes : destBytes;

		for (int i = 0 ; i < len ; i++) {
			tmp[i] = GXT8ToISO88591Table[((unsigned char*) src)[i]];
		}

		int endLen = Transcode((char*) tmp, len, dest, destBytes, ISO8859_1, destEnc);

		if (srcBytes > destBytes) {
			return ERR_INSUFFICIENT_BUFFER;
		}

		return endLen;
	} else if (srcEnc == GXT16) {
		// TODO We assume that GXT16 is just GXT8 with an unused second byte. Don't know if that's true.
		int tmpSize = srcBytes%2 == 0 ? srcBytes/2 : (srcBytes+1)/2;
		unsigned char* tmp = new unsigned char[tmpSize];
		int len = srcBytes < destBytes ? srcBytes : destBytes;

		for (int i = 0 ; i < len/2 ; i++) {
			tmp[i] = GXT8ToISO88591Table[((unsigned char*) src)[i*2]];
		}

		int endLen = Transcode((char*) tmp, tmpSize, dest, destBytes, ISO8859_1, destEnc);
		return endLen;
	}

	if (destEnc == GXT8) {
		// srcEnc -> GXT8 conversion is done by converting to ISO-8859-1 first and then to GXT8.
		unsigned char* tmp = new unsigned char[destBytes];
		unsigned char* udest = (unsigned char*) dest;
		int len = Transcode(src, srcBytes, (char*) tmp, destBytes, srcEnc, ISO8859_1);
		bool insufficient = false;

		if (len == ERR_INSUFFICIENT_BUFFER) {
			// We will still fill the buffer
			len = destBytes;
			insufficient = true;
		}

		for (int i = 0 ; i < len ; i++) {
			udest[i] = ISO88591ToGXT8Table[tmp[i]];
		}

		if (insufficient) {
			return ERR_INSUFFICIENT_BUFFER;
		}

		return len;
	} else if (destEnc == GXT16) {
		// TODO We assume that GXT16 is just GXT8 with an unused second byte. Don't know if that's true.
		int tmpSize = destBytes%2 == 0 ? destBytes/2 : (destBytes+1)/2;
		unsigned char* tmp = new unsigned char[tmpSize];
		unsigned char* udest = (unsigned char*) dest;
		int len = Transcode(src, srcBytes, (char*) tmp, tmpSize, srcEnc, ISO8859_1);
		bool insufficient = false;

		if (len == ERR_INSUFFICIENT_BUFFER) {
			// We will still fill the buffer
			len = tmpSize;
			insufficient = true;
		}

		for (int i = 0 ; i < len ; i++) {
			udest[i*2] = ISO88591ToGXT8Table[tmp[i]];
			udest[i*2+1] = '\0';
		}

		if (insufficient) {
			return ERR_INSUFFICIENT_BUFFER;
		}

		return len;
	}

#ifdef _HAVE_ICONV
	// On Linux we use iconv.

	const char* iconvSrcEnc;
	const char* iconvDestEnc;
	size_t inLeft = srcBytes;
	size_t outLeft = destBytes;

	switch (srcEnc) {
	case ASCII:
		iconvSrcEnc = "ASCII";
		break;
	case UTF8:
		iconvSrcEnc = "UTF-8";
		break;
	case UTF16:
		iconvSrcEnc = "UTF-16LE"; // "UTF-16" only would prepend a byte order mark (BOM)
		break;
	case WINDOWS1252:
		iconvSrcEnc = "WINDOWS-1252";
		break;
	case ISO8859_1:
		iconvSrcEnc = "ISO8859-1";
		break;
	default:
		// This should never happen
		assert(false);
	}

	switch (destEnc) {
	case ASCII:
		iconvDestEnc = "ASCII";
		break;
	case UTF8:
		iconvDestEnc = "UTF-8";
		break;
	case UTF16:
		iconvDestEnc = "UTF-16LE"; // "UTF-16" only would prepend a byte order mark (BOM)
		break;
	case WINDOWS1252:
		iconvDestEnc = "WINDOWS-1252";
		break;
	case ISO8859_1:
		iconvDestEnc = "ISO-8859-1";
		break;
	default:
		// This should never happen
		assert(false);
	}

	iconv_t ic = iconv_open(iconvDestEnc, iconvSrcEnc);
	size_t len = iconv(ic, &src, &inLeft, &dest, &outLeft);
	iconv_close(ic);

	if (len == (size_t)-1) {
		iconv_close(ic);

		switch (errno) {
		case EILSEQ:
		case EINVAL:
			return ERR_INVALID_SEQUENCE;
		case E2BIG:
			return ERR_INSUFFICIENT_BUFFER;
		}
	}

	// iconv() does NOT return the number of actual bytes written, but decrements outLeft for each byte.
	return destBytes-outLeft;
#elif defined(_WIN32)
	// On Windows we use The WinAPI Unicode functions.

	if (srcEnc == UTF16) {
		UINT cp;

		switch (destEnc) {
		case ASCII:
			cp = 20127;
			break;
		case UTF8:
			cp = 65001;
			break;
		case WINDOWS1252:
			cp = 1252;
			break;
		case ISO8859_1:
			cp = 28591;
			break;
		default:
			assert(false);
			break;
		}

		int len = WideCharToMultiByte(cp, 0, (LPWSTR) src, srcBytes/2, dest, destBytes, NULL, NULL);

		if (len == 0) {
			switch (GetLastError()) {
			case ERROR_INSUFFICIENT_BUFFER:
				return ERR_INSUFFICIENT_BUFFER;
			case ERROR_INVALID_FLAGS:
			case ERROR_INVALID_PARAMETER:
				return ERR_INVALID_PARAMETER;
			case ERROR_NO_UNICODE_TRANSLATION:
				return ERR_INVALID_SEQUENCE;
			}
		}

		return len;
	} else {
		if (destEnc == UTF16) {
			UINT cp;

			switch (srcEnc) {
			case ASCII:
				cp = 20127;
				break;
			case UTF8:
				cp = 65001;
				break;
			case WINDOWS1252:
				cp = 1252;
				break;
			case ISO8859_1:
				cp = 28591;
				break;
			default:
				assert(false);
				break;
			}

			int len = MultiByteToWideChar(cp, MB_PRECOMPOSED, src, srcBytes, (LPWSTR) dest, destBytes/2);

			if (len == 0) {
				switch (GetLastError()) {
				case ERROR_INSUFFICIENT_BUFFER:
					return ERR_INSUFFICIENT_BUFFER;
				case ERROR_INVALID_FLAGS:
				case ERROR_INVALID_PARAMETER:
					return ERR_INVALID_PARAMETER;
				case ERROR_NO_UNICODE_TRANSLATION:
					return ERR_INVALID_SEQUENCE;
				}
			}

			return len*2; // MultiByteToWideChar returns the number of CHARACTERS written to dest.
		} else {
			// Windows does not seem to have a function to directly convert one single-byte-encoding to
			// another, so we convert the string to UTF16 and then to destEnc.
			char* tmpBuf = new char[srcBytes*2];
			int len = Transcode(src, srcBytes, tmpBuf, srcBytes*2, srcEnc, UTF16);

			if (len == ERR_INSUFFICIENT_BUFFER) {
				// Actually, this should never happen because we choose tmpBuf as twice the size of srcBytes,
				// which should always fit perfect when converting a single-byte-encoding to UTF-16.
				len = srcBytes*2;
			} else if (len < 0) {
				return len;
			}

			len = Transcode(tmpBuf, srcBytes*2, dest, destBytes, UTF16, destEnc);
			delete[] tmpBuf;

			return len;
		}
	}
#endif
}