Ejemplo n.º 1
0
void show_ships(Map *m)
{
    int i;

    printf("Size:\t\t\t  1  2  3  4  5\n");

    printf("0) Aircraft carier (%i)\t", m->ships[0]);
    for(i=0;i<AIRCRAFT_CARRIER_SIZE; i++) PRINT_GREEN("  O");

    printf("\n1) Battleship (%i)\t", m->ships[1]);
    for(i=0;i<BATTLESHIP_SIZE; i++) PRINT_GREEN("  O");
    for(i=0;i<AIRCRAFT_CARRIER_SIZE-BATTLESHIP_SIZE; i++) PRINT_BLUE("  ~");

    printf("\n2) Submarine (%i)\t", m->ships[2]);
    for(i=0;i<SUBMARINE_SIZE; i++) PRINT_GREEN("  O");
    for(i=0;i<AIRCRAFT_CARRIER_SIZE-SUBMARINE_SIZE; i++) PRINT_BLUE("  ~");

    printf("\n3) Patrol boat (%i)\t", m->ships[3]);
    for(i=0;i<PATROL_BOAT_SIZE; i++) PRINT_GREEN("  O");
    for(i=0;i<AIRCRAFT_CARRIER_SIZE-PATROL_BOAT_SIZE; i++) PRINT_BLUE("  ~");

    printf("\n\n");
}
Ejemplo n.º 2
0
void show_map(Map *m)
{
    int i, j;

    // Print first line
    printf(" y\\x ");
    for (i=0; i<m->height; i++)
        if (i<10)
            printf("%i  ", i);
        else
            printf("%i ", i);

    printf("\n");

    // Print letters line
    for (i=0; i<m->width; i++)
    {
        // Print letter
        if (i<10)
            printf("  %i", i);
        else
            printf(" %i", i);

        for (j=0; j<m->height; j++)
        {
            switch(m->map[i][j])
            {
                case WATER:
                    PRINT_BLUE("  ~");
                    break;
                case MISS:
                    PRINT_RED("  ~");
                    break;
                case SHIP:
                    PRINT_GREEN("  O");
                    break;
                case HIT:
                    PRINT_RED("  X");
                    break;
                default:
                    printf("  ?");
                    break;
            }
            // printf("  %i", m->map[i][j]);

        }
        printf("\n");
    }
    printf("\n");
}
int main(int argc, char *argv[])
{
	LONG rv;
	SCARDCONTEXT hContext;
	DWORD dwReaders;
	LPSTR mszReaders = NULL;
	char *ptr, **readers = NULL;
	int nbReaders;
	SCARDHANDLE hCard;
	DWORD dwActiveProtocol, dwReaderLen, dwState, dwProt, dwAtrLen;
	BYTE pbAtr[MAX_ATR_SIZE] = "";
	char pbReader[MAX_READERNAME] = "";
	int reader_nb;
	unsigned int i;
	unsigned char bSendBuffer[MAX_BUFFER_SIZE];
	unsigned char bRecvBuffer[MAX_BUFFER_SIZE];
	DWORD send_length, length;
	DWORD verify_ioctl = 0;
	DWORD modify_ioctl = 0;
	DWORD pin_properties_ioctl = 0;
	DWORD mct_readerdirect_ioctl = 0;
	DWORD properties_in_tlv_ioctl = 0;
	DWORD ccid_esc_command = 0;
	SCARD_IO_REQUEST pioRecvPci;
	SCARD_IO_REQUEST pioSendPci;
	PCSC_TLV_STRUCTURE *pcsc_tlv;
#if defined(VERIFY_PIN) | defined(MODIFY_PIN)
	int offset;
#endif
#ifdef VERIFY_PIN
	PIN_VERIFY_STRUCTURE *pin_verify;
#endif
#ifdef MODIFY_PIN
	PIN_MODIFY_STRUCTURE *pin_modify;
#endif

	printf("SCardControl sample code\n");
	printf("V 1.4 © 2004-2010, Ludovic Rousseau <*****@*****.**>\n\n");

	printf(MAGENTA "THIS PROGRAM IS NOT DESIGNED AS A TESTING TOOL!\n");
	printf("Do NOT use it unless you really know what you do.\n\n" NORMAL);

	rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
	if (rv != SCARD_S_SUCCESS)
	{
		printf("SCardEstablishContext: Cannot Connect to Resource Manager %ulX\n", rv);
		return 1;
	}

	/* Retrieve the available readers list */
	rv = SCardListReaders(hContext, NULL, NULL, &dwReaders);
	PCSC_ERROR_EXIT(rv, "SCardListReaders")

	mszReaders = malloc(sizeof(char)*dwReaders);
	if (mszReaders == NULL)
	{
		printf("malloc: not enough memory\n");
		goto end;
	}

	rv = SCardListReaders(hContext, NULL, mszReaders, &dwReaders);
	if (rv != SCARD_S_SUCCESS)
		printf("SCardListReader: %ulX\n", rv);

	/* Extract readers from the null separated string and get the total
	 * number of readers */
	nbReaders = 0;
	ptr = mszReaders;
	while (*ptr != '\0')
	{
		ptr += strlen(ptr)+1;
		nbReaders++;
	}

	if (nbReaders == 0)
	{
		printf("No reader found\n");
		goto end;
	}

	/* allocate the readers table */
	readers = calloc(nbReaders, sizeof(char *));
	if (NULL == readers)
	{
		printf("Not enough memory for readers[]\n");
		goto end;
	}

	/* fill the readers table */
	nbReaders = 0;
	ptr = mszReaders;
	printf("Available readers (use command line argument to select)\n");
	while (*ptr != '\0')
	{
		printf("%d: %s\n", nbReaders, ptr);
		readers[nbReaders] = ptr;
		ptr += strlen(ptr)+1;
		nbReaders++;
	}
	printf("\n");

	if (argc > 1)
	{
		reader_nb = atoi(argv[1]);
		if (reader_nb < 0 || reader_nb >= nbReaders)
		{
			printf("Wrong reader index: %d\n", reader_nb);
			goto end;
		}
	}
	else
		reader_nb = 0;

	/* connect to a reader (even without a card) */
	dwActiveProtocol = -1;
	printf("Using reader: " GREEN "%s\n" NORMAL, readers[reader_nb]);
	rv = SCardConnect(hContext, readers[reader_nb], SCARD_SHARE_SHARED,
		SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol);
	printf(" Protocol: " GREEN "%uld\n" NORMAL, dwActiveProtocol);
	PCSC_ERROR_EXIT(rv, "SCardConnect")

#ifdef GET_GEMPC_FIRMWARE
	/* get GemPC firmware */
	printf(" Get GemPC Firmware\n");

	/* this is specific to Gemalto readers */
	bSendBuffer[0] = 0x02;
	rv = SCardControl(hCard, IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE, bSendBuffer,
		1, bRecvBuffer, sizeof(bRecvBuffer), &length);

	printf(" Firmware: " GREEN);
	for (i=0; i<length; i++)
		printf("%02X ", bRecvBuffer[i]);
	printf(NORMAL "\n");

	bRecvBuffer[length] = '\0';
	printf(" Firmware: " GREEN "%s" NORMAL" (length " GREEN "%ld" NORMAL " bytes)\n", bRecvBuffer, length);

	PCSC_ERROR_CONT(rv, "SCardControl")
#endif

	/* does the reader support PIN verification? */
	rv = SCardControl(hCard, CM_IOCTL_GET_FEATURE_REQUEST, NULL, 0,
		bRecvBuffer, sizeof(bRecvBuffer), &length);
	PCSC_ERROR_EXIT(rv, "SCardControl")

	printf(" TLV (%uld): " GREEN, length);
	for (i=0; i<length; i++)
		printf("%02X ", bRecvBuffer[i]);
	printf(NORMAL "\n");

	PCSC_ERROR_CONT(rv, "SCardControl(CM_IOCTL_GET_FEATURE_REQUEST)")

	if (length % sizeof(PCSC_TLV_STRUCTURE))
	{
		printf("Inconsistent result! Bad TLV values!\n");
		goto end;
	}

	/* get the number of elements instead of the complete size */
	length /= sizeof(PCSC_TLV_STRUCTURE);

	pcsc_tlv = (PCSC_TLV_STRUCTURE *)bRecvBuffer;
	for (i = 0; i < length; i++)
	{
		switch (pcsc_tlv[i].tag)
		{
			case FEATURE_VERIFY_PIN_DIRECT:
				PRINT_GREEN("Reader supports", "FEATURE_VERIFY_PIN_DIRECT");
				verify_ioctl = ntohl(pcsc_tlv[i].value);
				break;
			case FEATURE_MODIFY_PIN_DIRECT:
				PRINT_GREEN("Reader supports", "FEATURE_MODIFY_PIN_DIRECT");
				modify_ioctl = ntohl(pcsc_tlv[i].value);
				break;
			case FEATURE_IFD_PIN_PROPERTIES:
				PRINT_GREEN("Reader supports", "FEATURE_IFD_PIN_PROPERTIES");
				pin_properties_ioctl = ntohl(pcsc_tlv[i].value);
				break;
			case FEATURE_MCT_READER_DIRECT:
				PRINT_GREEN("Reader supports", "FEATURE_MCT_READER_DIRECT");
				mct_readerdirect_ioctl = ntohl(pcsc_tlv[i].value);
				break;
			case FEATURE_GET_TLV_PROPERTIES:
				PRINT_GREEN("Reader supports", "FEATURE_GET_TLV_PROPERTIES");
				properties_in_tlv_ioctl = ntohl(pcsc_tlv[i].value);
				break;
			case FEATURE_CCID_ESC_COMMAND:
				PRINT_GREEN("Reader supports", "FEATURE_CCID_ESC_COMMAND");
				ccid_esc_command = ntohl(pcsc_tlv[i].value);
				break;
			default:
				PRINT_RED_DEC("Can't parse tag", pcsc_tlv[i].tag);
		}
	}
	printf("\n");

	if (properties_in_tlv_ioctl)
	{
		int value;
		int ret;

		rv = SCardControl(hCard, properties_in_tlv_ioctl, NULL, 0,
			bRecvBuffer, sizeof(bRecvBuffer), &length);
		PCSC_ERROR_CONT(rv, "SCardControl(GET_TLV_PROPERTIES)")

		printf("GET_TLV_PROPERTIES (" GREEN "%uld" NORMAL "): " GREEN, length);
		for (i=0; i<length; i++)
			printf("%02X ", bRecvBuffer[i]);
		printf(NORMAL "\n");

		printf("\nDisplay all the properties:\n");
		parse_properties(bRecvBuffer, length);

		printf("\nFind a specific property:\n");
		ret = PCSCv2Part10_find_TLV_property_by_tag_from_buffer(bRecvBuffer, length, PCSCv2_PART10_PROPERTY_wIdVendor, &value);
		if (ret)
			PRINT_RED_DEC(" wIdVendor", ret);
		else
			PRINT_GREEN_HEX4(" wIdVendor", value);

		ret = PCSCv2Part10_find_TLV_property_by_tag_from_hcard(hCard, PCSCv2_PART10_PROPERTY_wIdProduct, &value);
		if (ret)
			PRINT_RED_DEC(" wIdProduct", ret);
		else
			PRINT_GREEN_HEX4(" wIdProduct", value);

		printf("\n");
	}

	if (mct_readerdirect_ioctl)
	{
		char secoder_info[] = { 0x20, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };

		rv = SCardControl(hCard, mct_readerdirect_ioctl, secoder_info,
			sizeof(secoder_info), bRecvBuffer, sizeof(bRecvBuffer), &length);
		PCSC_ERROR_CONT(rv, "SCardControl(MCT_READER_DIRECT)")

		printf("MCT_READER_DIRECT (%uld): ", length);
		for (i=0; i<length; i++)
			printf("%02X ", bRecvBuffer[i]);
		printf("\n");
	}

	if (pin_properties_ioctl)
	{
		PIN_PROPERTIES_STRUCTURE *pin_properties;

		rv = SCardControl(hCard, pin_properties_ioctl, NULL, 0,
			bRecvBuffer, sizeof(bRecvBuffer), &length);
		PCSC_ERROR_CONT(rv, "SCardControl(pin_properties_ioctl)")

		printf("PIN PROPERTIES (" GREEN "%uld" NORMAL "): " GREEN, length);
		for (i=0; i<length; i++)
			printf("%02X ", bRecvBuffer[i]);
		printf(NORMAL "\n");

		pin_properties = (PIN_PROPERTIES_STRUCTURE *)bRecvBuffer;
		PRINT_GREEN_HEX4(" wLcdLayout", pin_properties -> wLcdLayout);
		PRINT_GREEN_DEC(" bEntryValidationCondition", pin_properties ->	bEntryValidationCondition);
		PRINT_GREEN_DEC(" bTimeOut2", pin_properties -> bTimeOut2);

		printf("\n");
	}

#ifdef GET_GEMPC_FIRMWARE
	if (ccid_esc_command)
	{
		/* get GemPC firmware */
		printf("Get GemPC Firmware\n");

		/* this is specific to Gemalto readers */
		bSendBuffer[0] = 0x02;
		rv = SCardControl(hCard, ccid_esc_command, bSendBuffer,
			1, bRecvBuffer, sizeof(bRecvBuffer), &length);

		printf(" Firmware: " GREEN);
		for (i=0; i<length; i++)
			printf("%02X ", bRecvBuffer[i]);
		printf(NORMAL "\n");

		bRecvBuffer[length] = '\0';
		printf(" Firmware: " GREEN "%s" NORMAL" (length " GREEN "%ld" NORMAL " bytes)\n", bRecvBuffer, length);

		PCSC_ERROR_CONT(rv, "SCardControl")
	}
#endif

	if (0 == verify_ioctl)
	{
		printf("Reader %s does not support PIN verification\n",
			readers[reader_nb]);
		goto end;
	}

	/* get card status */
	dwAtrLen = sizeof(pbAtr);
	dwReaderLen = sizeof(pbReader);
	rv = SCardStatus(hCard, pbReader, &dwReaderLen, &dwState, &dwProt,
		pbAtr, &dwAtrLen);
	printf(" Reader: %s (length %uld bytes)\n", pbReader, dwReaderLen);
	printf(" State: 0x%04ulX\n", dwState);
	printf(" Prot: %uld\n", dwProt);
	printf(" ATR (length %uld bytes):", dwAtrLen);
	for (i=0; i<dwAtrLen; i++)
		printf(" %02X", pbAtr[i]);
	printf("\n");
	PCSC_ERROR_CONT(rv, "SCardStatus")

	if (dwState & SCARD_ABSENT)
	{
		printf("No card inserted\n");
		goto end;
	}

	/* connect to a reader (even without a card) */
	dwActiveProtocol = -1;
	rv = SCardReconnect(hCard, SCARD_SHARE_SHARED,
		SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1, SCARD_LEAVE_CARD,
		&dwActiveProtocol);
	printf(" Protocol: %uld\n", dwActiveProtocol);
	PCSC_ERROR_EXIT(rv, "SCardReconnect")

	switch(dwActiveProtocol)
	{
		case SCARD_PROTOCOL_T0:
			pioSendPci = *SCARD_PCI_T0;
			break;
		case SCARD_PROTOCOL_T1:
			pioSendPci = *SCARD_PCI_T1;
			break;
		default:
			printf("Unknown protocol. No card present?\n");
			return -1;
	}

	/* APDU select applet */
	printf("Select applet: ");
	send_length = 11;
	memcpy(bSendBuffer, "\x00\xA4\x04\x00\x06\xA0\x00\x00\x00\x18\xFF",
		send_length);
	for (i=0; i<send_length; i++)
		printf(" %02X", bSendBuffer[i]);
	printf("\n");
	length = sizeof(bRecvBuffer);
	rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, send_length,
		&pioRecvPci, bRecvBuffer, &length);
	printf(" card response:");
	for (i=0; i<length; i++)
		printf(" %02X", bRecvBuffer[i]);
	printf("\n");
	PCSC_ERROR_EXIT(rv, "SCardTransmit")
	if ((bRecvBuffer[0] != 0x90) || (bRecvBuffer[1] != 0x00))
	{
		printf("Error: test applet not found!\n");
		goto end;
	}

#ifdef VERIFY_PIN
	/* verify PIN */
	printf(" Secure verify PIN\n");
	pin_verify = (PIN_VERIFY_STRUCTURE *)bSendBuffer;

	/* table for bEntryValidationCondition
	 * 0x01: Max size reached
	 * 0x02: Validation key pressed
	 * 0x04: Timeout occured
	 */
	/* PC/SC v2.02.05 Part 10 PIN verification data structure */
	pin_verify -> bTimerOut = 0x00;
	pin_verify -> bTimerOut2 = 0x00;
	pin_verify -> bmFormatString = 0x82;
	pin_verify -> bmPINBlockString = 0x04;
	pin_verify -> bmPINLengthFormat = 0x00;
	pin_verify -> wPINMaxExtraDigit = 0x0408; /* Min Max */
	pin_verify -> bEntryValidationCondition = 0x02;	/* validation key pressed */
	pin_verify -> bNumberMessage = 0x01;
	pin_verify -> wLangId = 0x0904;
	pin_verify -> bMsgIndex = 0x00;
	pin_verify -> bTeoPrologue[0] = 0x00;
	pin_verify -> bTeoPrologue[1] = 0x00;
	pin_verify -> bTeoPrologue[2] = 0x00;
	/* pin_verify -> ulDataLength = 0x00; we don't know the size yet */

	/* APDU: 00 20 00 00 08 30 30 30 30 00 00 00 00 */
	offset = 0;
	pin_verify -> abData[offset++] = 0x00;	/* CLA */
	pin_verify -> abData[offset++] = 0x20;	/* INS: VERIFY */
	pin_verify -> abData[offset++] = 0x00;	/* P1 */
	pin_verify -> abData[offset++] = 0x00;	/* P2 */
	pin_verify -> abData[offset++] = 0x08;	/* Lc: 8 data bytes */
	pin_verify -> abData[offset++] = 0x30;	/* '0' */
	pin_verify -> abData[offset++] = 0x30;	/* '0' */
	pin_verify -> abData[offset++] = 0x30;	/* '0' */
	pin_verify -> abData[offset++] = 0x30;	/* '0' */
	pin_verify -> abData[offset++] = 0x00;	/* '\0' */
	pin_verify -> abData[offset++] = 0x00;	/* '\0' */
	pin_verify -> abData[offset++] = 0x00;	/* '\0' */
	pin_verify -> abData[offset++] = 0x00;	/* '\0' */
	pin_verify -> ulDataLength = offset;	/* APDU size */

	length = sizeof(PIN_VERIFY_STRUCTURE) + offset -1;	/* -1 because PIN_VERIFY_STRUCTURE contains the first byte of abData[] */

	printf(" command:");
	for (i=0; i<length; i++)
		printf(" %02X", bSendBuffer[i]);
	printf("\n");
	printf("Enter your PIN: ");
	fflush(stdout);
	rv = SCardControl(hCard, verify_ioctl, bSendBuffer,
		length, bRecvBuffer, sizeof(bRecvBuffer), &length);

	{
#ifndef S_SPLINT_S
		fd_set fd;
#endif
		struct timeval timeout;

		FD_ZERO(&fd);
		FD_SET(STDIN_FILENO, &fd);	/* stdin */
		timeout.tv_sec = 0;			/* timeout = 0.1s */
		timeout.tv_usec = 100000;

		/* we only try to read stdin if the pinpad is on a keyboard
		 * we do not read stdin for a SPR 532 for example */
		if (select(1, &fd, NULL, NULL, &timeout) > 0)
		{
			/* read the fake digits */
			char in[40];	/* 4 digits + \n + \0 */
			(void)fgets(in, sizeof(in), stdin);

			printf("keyboard sent: %s", in);
		}
		else
			/* if it is not a keyboard */
			printf("\n");
	}

	printf(" card response:");
	for (i=0; i<length; i++)
		printf(" %02X", bRecvBuffer[i]);
	printf("\n");
	PCSC_ERROR_CONT(rv, "SCardControl")

	/* verify PIN dump */
	printf("\nverify PIN dump: ");
	send_length = 5;
	memcpy(bSendBuffer, "\x00\x40\x00\x00\xFF",
		send_length);
	for (i=0; i<send_length; i++)
		printf(" %02X", bSendBuffer[i]);
	printf("\n");
	length = sizeof(bRecvBuffer);
	rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, send_length,
		&pioRecvPci, bRecvBuffer, &length);
	printf(" card response:");
	for (i=0; i<length; i++)
		printf(" %02X", bRecvBuffer[i]);
	printf("\n");
	PCSC_ERROR_EXIT(rv, "SCardTransmit")

	if ((2 == length) && (0x6C == bRecvBuffer[0]))
	{
		printf("\nverify PIN dump: ");
		send_length = 5;
		memcpy(bSendBuffer, "\x00\x40\x00\x00\xFF",
			send_length);
		bSendBuffer[4] = bRecvBuffer[1];
		for (i=0; i<send_length; i++)
			printf(" %02X", bSendBuffer[i]);
		printf("\n");
		length = sizeof(bRecvBuffer);
		rv = SCardTransmit(hCard, &pioSendPci, bSendBuffer, send_length,
			&pioRecvPci, bRecvBuffer, &length);
		printf(" card response:");
		for (i=0; i<length; i++)
			printf(" %02X", bRecvBuffer[i]);
		printf("\n");
		PCSC_ERROR_EXIT(rv, "SCardTransmit")
	}
Ejemplo n.º 4
0
Scene* Parser::GetSceneFromFile(std::string filename)
{
    Scene* scene = NULL;
    fstream fichierScene(filename.c_str(), ios::in );

    if( fichierScene.is_open() )
    {
        PRINT_GREEN("Fchier de scene bien ouvert.");
        scene = new Scene();
        EtatTraitementScene EtatCourant = TRAITEMENT_SCENE;
        EtatTraitementScene EtatNouveau = TRAITEMENT_SCENE;

        char line[ NB_MAX_CAR_PAR_LIGNE ];
        string buffer;

        Light light;
        Triangle triangle;
        Plan plan;
        Quadrique quadric;
        Materiau materiau;

        float Val0, Val1, Val2;
        float  R, G, B;

        while( !fichierScene.eof() )
        {
            fichierScene.getline( line, NB_MAX_CAR_PAR_LIGNE );
            buffer = line;
            CStringUtils::Trim( buffer, " ");

            // Passer les lignes vides et les commentaires
            if( buffer.empty() || buffer[ 0 ] == '*'  || buffer[ 0 ] == '\r' )
                continue;
            else
            {
                // Vérifier l'arrivée d'un nouvel état de traitement
                bool EstNouvelObjetScene = true;
                if     ( STRING_CHECKFIND( buffer, "Lumiere:" ) ) EtatNouveau = TRAITEMENT_LUMIERE;
                else if( STRING_CHECKFIND( buffer, "Poly:"    ) ) EtatNouveau = TRAITEMENT_TRIANGLE;
                else if( STRING_CHECKFIND( buffer, "Plane:"   ) ) EtatNouveau = TRAITEMENT_PLAN;
                else if( STRING_CHECKFIND( buffer, "Quad:"    ) ) EtatNouveau = TRAITEMENT_QUADRIQUE;
                else
                    EstNouvelObjetScene = false;

                if( EstNouvelObjetScene )
                {
                    // Ajouter objet nouvellement traité à la scène
                    if( EtatCourant != TRAITEMENT_SCENE )
                    {
                        if( EtatCourant == TRAITEMENT_LUMIERE )
                            scene->AddLight(light);
                        else
                        {
                            switch(EtatCourant)
                            {
                            case TRAITEMENT_PLAN:
                                scene->AddPlane(plan, materiau);
                                break;
                            case TRAITEMENT_TRIANGLE:
                                scene->AddTriangle(triangle, materiau);
                                break;
                            case TRAITEMENT_QUADRIQUE:
                                scene->AddQuadric(quadric, materiau);
                                break;
                            default:
                                PRINT_RED("Cas non pris en charge.");
                            }
                        }
                    }

                    // Substituer le nouvel état pour l'ancien
                    EtatCourant = EtatNouveau;
                }
                else
                {
                    // Remplir les informations génériques de l'objet courant

                    bool IsGenericsurfaceInfo = true;

                    if( STRING_CHECKFIND( buffer, "color:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &R, &G, &B );
                        materiau.color = Vector4(R, G, B, 1.0f);
                    }
                    /*else if( STRING_CHECKFIND( buffer, "ambient:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f", line, &Val0 );
                        surface->AjusterCoeffAmbiant( Val0 );
                    }
                    else if( STRING_CHECKFIND( buffer, "diffus:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f", line, &Val0 );
                        surface->AjusterCoeffDiffus( Val0 );
                    }
                    else if( STRING_CHECKFIND( buffer, "specular:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f", line, &Val0, &Val1 );
                        surface->AjusterCoeffSpeculaire( Val0 );
                        surface->AjusterCoeffBrillance( Val1 );
                    }*/
                    else if( STRING_CHECKFIND( buffer, "reflect:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f", line, &Val0 );
                        materiau.coeffReflexion = Val0;
                    }
                    else if( STRING_CHECKFIND( buffer, "refract:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f", line, &Val0, &Val1 );
                        materiau.coeffRefraction = Val0;
                        materiau.indiceRefraction = Val1;
                    }/*
                    else if( STRING_CHECKFIND( buffer, "rotate:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );

                        CMatrice4 Transform = surface->ObtenirTransformation();
                        Transform.RotationAutourDesX( Deg2Rad<REAL>( Val0 ) );
                        Transform.RotationAutourDesY( Deg2Rad<REAL>( Val1 ) );
                        Transform.RotationAutourDesZ( Deg2Rad<REAL>( Val2 ) );
                        surface->AjusterTransformation( Transform );
                    }
                    else if( STRING_CHECKFIND( buffer, "translate:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        CMatrice4 Transform = surface->ObtenirTransformation();
                        Transform.Translation( Val0, Val1, Val2 );
                        surface->AjusterTransformation( Transform );
                    }
                    else if( STRING_CHECKFIND( buffer, "scale:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        CMatrice4 Transform = surface->ObtenirTransformation();
                        Transform.MiseAEchelle( Val0, Val1, Val2 );
                        surface->AjusterTransformation( Transform );
                    }*/
                    else
                        IsGenericsurfaceInfo = false;

                    if( IsGenericsurfaceInfo )
                        continue;
                }

                // Remplir les infos spécifiques à l'objet
                switch( EtatCourant )
                {
                case TRAITEMENT_SCENE:

                    /*if( STRING_CHECKFIND( buffer, "background:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %i %i %i", line, &R, &G, &B );
                        AjusterCouleurArrierePlan( CCouleur( R, G, B ) );
                    }
                    else if( STRING_CHECKFIND( buffer, "origin:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        AjusterPositionCamera( CVecteur3( Val0, Val1, Val2 ) );
                    }
                    else if( STRING_CHECKFIND( buffer, "eye:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        AjusterPointViseCamera( CVecteur3( Val0, Val1, Val2 ) );
                    }
                    else if( STRING_CHECKFIND( buffer, "up:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        AjusterVecteurUpCamera( CVecteur3( Val0, Val1, Val2 ) );
                    }
*/


                    break;

                case TRAITEMENT_LUMIERE:

                    if( STRING_CHECKFIND( buffer, "position:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        light.position = Vector3(Val0, Val1, Val2);
                    }
                    else if( STRING_CHECKFIND( buffer, "intens:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f", line, &Val0 );
                        light.intensity = Val0;
                    }
                    else if( STRING_CHECKFIND( buffer, "colorSpec:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &R, &G, &B );
                        light.color = Vector3(R, G, B);
                    }

                    break;

                case TRAITEMENT_TRIANGLE:

                    if( STRING_CHECKFIND( buffer, "point:" ) )
                    {
                        int PtIdx;
                        sscanf( buffer.c_str(), "%s %i %f %f %f", line, &PtIdx, &Val0, &Val1, &Val2 );
                        switch(PtIdx)
                        {
                            case 0:
                            triangle.p0 = Vector3(Val0, Val1, Val2);
                            break;
                            case 1:
                            triangle.p1 = Vector3(Val0, Val1, Val2);
                            break;
                            case 2:
                            triangle.p2 = Vector3(Val0, Val1, Val2);
                            triangle.normale = Vector3::crossProduct(triangle.p1-triangle.p0,triangle.p2-triangle.p0);
                            triangle.normale = triangle.normale/triangle.normale.Norm();
                            break;
                        }
                    }
                    else if( STRING_CHECKFIND( buffer, "uv:" ) )
                    {
                        int PtIdx;
                        sscanf( buffer.c_str(), "%s %i %f %f", line, &PtIdx, &Val0, &Val1 );
                        switch(PtIdx)
                        {
                            case 0:
			      triangle.uv0 = vec2(Val0,Val1);
			      break;
			    case 1:
			      triangle.uv1 = vec2(Val0,Val1);
			      break;
			    case 2:
			      triangle.uv2 = vec2(Val0,Val1);
			      break;
                        }
                    }

                    break;

                case TRAITEMENT_PLAN:

                    if( STRING_CHECKFIND( buffer, "v_linear:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        //( ( CPlan* )surface )->AjusterNormale( CVecteur3( Val0, Val1, Val2 ) );
                    }
                    else if( STRING_CHECKFIND( buffer, "v_const:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f", line, &Val0 );
                        //( ( CPlan* )surface )->AjusterConstante( Val0 );
                    }

                    break;

                case TRAITEMENT_QUADRIQUE:

                    if( STRING_CHECKFIND( buffer, "v_quad:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        quadric.A = Val0;
                        quadric.B = Val1;
                        quadric.C = Val2;
                    }
                    else if( STRING_CHECKFIND( buffer, "v_mixte:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        quadric.D = Val0;
                        quadric.E = Val1;
                        quadric.F = Val2;
                    }
                    else if( STRING_CHECKFIND( buffer, "v_linear:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f %f %f", line, &Val0, &Val1, &Val2 );
                        quadric.G = Val0;
                        quadric.H = Val1;
                        quadric.I = Val2;
                    }
                    else if( STRING_CHECKFIND( buffer, "v_const:" ) )
                    {
                        sscanf( buffer.c_str(), "%s %f", line, &Val0 );
                        quadric.J = Val0;
                    }
                    break;
                default:
                    PRINT_RED("Cas non pris en charge.");
                }
            }
        }

        // Fermer le fichier de scène
        fichierScene.close();

        // Ajouter le dernier objet traité
        switch(EtatCourant)
        {
        case TRAITEMENT_PLAN:
            scene->AddPlane(plan, materiau);
            break;
        case TRAITEMENT_TRIANGLE:
            scene->AddTriangle(triangle, materiau);
            break;
        case TRAITEMENT_QUADRIQUE:
            scene->AddQuadric(quadric, materiau);
            break;
        case TRAITEMENT_LUMIERE:
            scene->AddLight(light);
            break;
        default:
            PRINT_RED("Cas non pris en charge.");
        }
    }
    else
        PRINT_RED("[Parser::GetSceneFromFile()] : Incapable d'ouvrir " << filename);

    return scene;
}