/* Funcion que genera la cadena de bytes para almacenar la Formacion. Debe recibir por
 * referencia un int que pueda almacenar el tamaño de la cadena, para su guardado
 * posterior en el archivo.
 */
Byte * CampoCadena::obtenerRegistro(int *tam){
	//Obtengo el tamaño de la cadena y lo serializo
	int tamDescripcion = this->descripcion.size()+1; //agrego 1 para incluir el caracter nulo
	Byte *sizeString = intToBytes(tamDescripcion);
	// Serializo la descripcion
	Byte *string = convertirAByte(this->descripcion);
	// Defino el tamaño de 'sizeString'+'string' y lo serializo
	int tamRegistro = (int)sizeof(int) + tamDescripcion;
	Byte *sizeRegistro = intToBytes(tamRegistro);
	// Defino el tamaño total que va a tener la serializacion
	*tam = sizeof(int)*2 + tamDescripcion;
	// concateno los integer
	Byte *tmp;
	concatenar(&tmp, sizeRegistro, 4, sizeString, 4);
	// concateno el tmp con la descripcion
	Byte *registro;
	concatenar(&registro, tmp, 8, string, tamDescripcion);
	// elimino los punteros internos
	delete sizeString;
	delete string;
	delete tmp;
	//retorno
	return registro;
}
Exemple #2
0
void IpcClient::sendCommand(const QString& command, ElevateMode const elevate)
{
	QDataStream stream(m_Socket);

	stream.writeRawData(kIpcMsgCommand, 4);

	std::string stdStringCommand = command.toStdString();
	const char* charCommand = stdStringCommand.c_str();
	int length = strlen(charCommand);

	char lenBuf[4];
	intToBytes(length, lenBuf, 4);
	stream.writeRawData(lenBuf, 4);
	stream.writeRawData(charCommand, length);

	char elevateBuf[1];
    // Refer to enum ElevateMode documentation for why this flag is mapped this way
	elevateBuf[0] = (elevate == ElevateAlways) ? 1 : 0;
	stream.writeRawData(elevateBuf, 1);
}
Exemple #3
0
         bool XMLRPC::stringListToBytes(const t_strList* _source)
         {
            t_int const list_size = _source->size();

            // Write the length of the list:
            BTG_ICHECK( intToBytes(&list_size) );

            // Write the characters in the string to the byte array:
            t_strList::const_iterator ci;
            std::string ii("");
            for (ci = _source->begin(); ci != _source->end(); ci++)
               {
                  ii          = "";
                  ii          = *ci;
                  BTG_ICHECK( stringToBytes(&ii) );
               }


            return true;
         }
/*
	Envoi d'une requète R_demandePartieSuivanteFichier au serveur.

	Ecris la partie du fichier dans buf
*/
int partieSuivante(client *cl, char *buf, int partFichier){
	int nbrTentative = 0;
	int nbrMaxTentative = 5;
	int erreur = 0;

	char buffer[R_tailleMaxReq];

	requete reqSend;
	requete reqRecv;

	intToBytes(buffer, partFichier);

	// Initialise une requète de type R_demandePartieSuivanteFichier et la converti en octets
	initRequete(&reqSend, R_demandePartieSuivanteFichier, cl->id, sizeof(int), buffer);
	requeteToBytes(buffer,reqSend);


	do{
		erreur = sendto(cl->fdSocket, buffer, sizeofReq(reqSend),
			0, (struct sockaddr*) &(cl->addrSend), sizeof(struct sockaddr_in));

		if (erreur < 0){
			perror("Erreur lors de l'appel à partieSuivante, sendto renvois une erreur");
			return -6;
		}

		erreur = definirTimeOut(cl->fdSocket, C_timeoutDemandeFichier);

		if (erreur < 0){
			perror("Erreur lors de l'appel à partieSuivante, problème lors du select");
			return -2;
		}else if(erreur == 0){
			nbrTentative++;
			initRequete(&reqSend, R_demandePartieSuivanteFichier, cl->id, sizeof(int), buffer);
			requeteToBytes(buffer,reqSend);
		}else{
			/* si le serveur à reçu la demande de connexion */
			socklen_t fromlen = sizeof(struct sockaddr_in);
			erreur = recvfrom(cl->fdSocket,buffer,R_tailleMaxReq,
				0,(struct sockaddr*) &(cl->addrRecv),&fromlen);
			if (erreur < 0){
				perror("Erreur lors de l'appel à partieSuivante, recvfrom renvois une erreur");
				return -3;
			}

			// Initialise une requète avec les octets envoyer par le serveur
			initRequeteFromBytes(&reqRecv, buffer);
			if (reqRecv.typeReq == R_okPartieSuivanteFichier){
				memcpy(buf, reqRecv.data, reqRecv.tailleData);
				return reqRecv.tailleData;
			}else if(reqRecv.typeReq == R_finFichier){
				printf("Fichier finit\n");
				return -1;
			}else if (reqRecv.typeReq == R_fichierAudioNonTrouver){
				printf("Erreur lors de partieSuivante, le serveur ne trouve pas le fichier\n");
				return -7;
			}else if(reqRecv.typeReq == R_idInexistant){
				printf("Le serveur ne reconnais pas l'id qui à été envoyer lors de la demande de fichier\n");
			}else{
				printf("La requète reçu en réponse à la demande de fichier n'est pas prévue: %d\n",reqRecv.typeReq);
				return -4;
			}
			
		}		
	} while (nbrTentative < nbrMaxTentative);
	printf("Echec de demande de fichier, aucune réponse\n");
	return -5;
}