void MediaUpload::sendMedia(QString jid, FMessage message) { MediaDescriptor descriptor; descriptor.waType = (FMessage::MediaWAType) message.media_wa_type; descriptor.extension = Utilities::getExtension(message.media_name); descriptor.duration = message.media_duration_seconds; descriptor.contentType = message.media_mime_type.isEmpty() ? Utilities::guessMimeType(descriptor.extension) : message.media_mime_type; descriptor.localFileUri = message.media_name; descriptor.url = message.media_url; descriptor.upload = (message.status == FMessage::Uploading); descriptor.live = message.live; switch (descriptor.waType) { case FMessage::Image: sendPicture(jid, descriptor); break; case FMessage::Video: sendVideo(jid, descriptor); break; case FMessage::Audio: sendMedia(jid, descriptor); default: break; } }
void sendSingle(void) { sendText(); if (estgbconf.imgfile) sendPicture(estgbconf.imgfile); if (estgbconf.videofile) sendVideo(estgbconf.videofile); if (estgbconf.audiofile) sendAudio(estgbconf.audiofile); if (estgbconf.docfile) sendDocument(estgbconf.docfile); }
Call::Call(int callId, QString myName) { #ifdef REN_DEBUG qWarning(QString("Call::Call(int %1, QString %2)").arg(callId).arg(myName)); #endif id = callId; sd = -1; dec_state = NULL; dec_state = speex_decoder_init(&speex_uwb_mode); // renyang - Initializes and allocates resources for a SpeexBits struct speex_bits_init(&bits); int enh = 1; speex_decoder_ctl(dec_state, SPEEX_SET_ENH, &enh); speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &frame_size); if ((outBuffer = (float *) malloc(frame_size*4*sizeof(float)))==NULL) throw Error(Error::IHU_ERR_MEMORY); if ((soundBuffer = (float *) malloc(MAXBUFSIZE*sizeof(float)))==NULL) throw Error(Error::IHU_ERR_MEMORY); readyFrames = 0; rsa = new Rsa(RSA_STRENGTH); transmitter = new Transmitter(rsa); receiver = new Receiver(rsa); // renyang-modify 建立一個ip handler sctpiphandler = new SctpIPHandler(); // renyang-modify - 當某一個ip沒有一段時間後, 沒有辦法收到data, 要處理 connect(sctpiphandler,SIGNAL(SigAddressConfrim(QString)),this,SLOT(SlotAddressConfirm(QString))); // renyang-modify - 當多次沒有收到資料, 宣告這一個ip失聯 connect(sctpiphandler,SIGNAL(SigAddressFail(QString)),this,SLOT(SlotAddressFail(QString))); // renyang-modify - 某一個ip有收到資料, 宣告這一個ip復活啦 connect(sctpiphandler,SIGNAL(SigAddressAvailable(QString)),this,SLOT(SlotAddressAvailable(QString))); stopTimer = new QTimer(this); active = false; muteRec = false; mutePlay = false; callFree = true; aborted = false; recording = false; // renyang-modify - 初始化IPChanging, 表示最近沒有改變primary address IPChanging = false; // renyang-modify - 建立一個Timer來計數改完primary address後多久要改回IPChanging=false IPChangingTimer = new QTimer(this); connect(IPChangingTimer,SIGNAL(timeout()),this,SLOT(resetIPChanging())); // renyang-modify - 初始化傳送與接收image的index recvImage_index = sendImage_index = 0; transmitter->setMyName(myName); srand(time(NULL)); connect( receiver, SIGNAL(newSocket(int,int,struct sockaddr_in)), this, SLOT(newConnection(int,int,struct sockaddr_in)) ); connect( receiver, SIGNAL(keyRequest()), this, SLOT(sendKeyRequest()) ); connect( receiver, SIGNAL(sendNewKey()), this, SLOT(sendKey()) ); connect( receiver, SIGNAL(newKey(QString)), this, SLOT(receivedNewKey(QString)) ); // renyang - 沒有再接收到client端傳送過來的訊息, 結束此Call connect( receiver, SIGNAL(finishSignal()), this, SLOT(stopCall()) ); connect( receiver, SIGNAL(error(QString)), this, SLOT(abortCall(QString)) ); connect( receiver, SIGNAL(warning(QString)), this, SLOT(warning(QString)) ); connect( receiver, SIGNAL(message(QString)), this, SLOT(warning(QString)) ); // renyang - 對方接受通話, 或是本地端接受通話 connect( receiver, SIGNAL(connectedSignal()), this, SLOT(connected()) ); connect( receiver, SIGNAL(ringSignal()), this, SLOT(playRing()) ); connect( receiver, SIGNAL(initSignal()), this, SLOT(playInit()) ); connect( receiver, SIGNAL(newAudioData(char*, int)), this, SLOT(decodeAudioData(char*, int)) ); connect( receiver, SIGNAL(ringReplySignal()), transmitter, SLOT(sendRingReplyPacket()) ); // renyang-modify - 接收由receiver傳送上來的peer address connect (receiver,SIGNAL(SignalgetIps(QStringList)),this,SLOT(SlotgetIps(QStringList))); // renyang-modify - 當Receiver接收到與之前的primary不同時, 要求改變primary address connect (receiver,SIGNAL(setPrimaddrSignal(QString)),this,SLOT(setPrimaddr(QString))); // renyang-modify - 當Receiver接收到事件時, 會通知上層的Call, 以便修改CallTab的ip list情況 connect (receiver,SIGNAL(SigAddressEvent(QString,QString)),this,SLOT(SlotAddressEvent(QString,QString))); // renyang-modify - 對方要求影像 connect (receiver,SIGNAL(requestImage()),this,SLOT(SlotGetImage())); // renyang-modify - 由receiver接收到image資料, 並處理這一些資料 connect (receiver,SIGNAL(newVideoData(char *,int)),this,SLOT(decodeVideoData(char *,int))); // renyang-modify - 當收到想要接收目前封包的下一部分時... connect (receiver,SIGNAL(requestNextImage()),this,SLOT(sendVideo())); // renyang-modify - 接收到完整的image,準備把它放到video_label connect (receiver,SIGNAL(completeImage()),this,SLOT(processImage())); // renyang-modify - 跟對方要求影像失敗 connect (receiver,SIGNAL(requestImageFail()),this,SLOT(SlotrequestImageFail())); // renyang-modify - end connect( transmitter, SIGNAL(ringMessage()), this, SLOT(ringMessage()) ); connect( transmitter, SIGNAL(finishSignal()), this, SLOT(stopCall()) ); connect( transmitter, SIGNAL(error(QString)), this, SLOT(abortCall(QString)) ); connect( transmitter, SIGNAL(message(QString)), this, SLOT(message(QString)) ); connect( transmitter, SIGNAL(startSignal()), this, SLOT(startRecorder()) ); connect( stopTimer, SIGNAL(timeout()), this, SLOT(close()) ); // renyang-modify - 初始化streamno streamno = 1; }
//Connection protocol handler void *connection_handler(void *arg) { int value; int len = 8*10; char *buff = (char*)malloc(len); //Command buffer //send_policy_file(data_child); while(client_connected) { freenect_network_read(buff, &len); //If command length is multiple of 6 if(len > 0 && len % 6 == 0){ //Get the number of commands received int max = len / 6; int i; //For each command received for(i = 0; i < max; i++){ memcpy(&value, &buff[2 + (i*6)], sizeof(int)); value = ntohl(value); //The BIG switch (Communication protocol) switch(buff[0 + (i*6)]){ case 0: //CAMERA switch(buff[1 + (i*6)]){ case 0: //GET DEPTH sendDepth(); break; case 1: //GET RAW DEPTH sendRawDepth(); break; case 2: //GET RGB sendVideo(); break; case 3: //Mirror depth _depth_mirrored = value; break; case 4: //Mirror video _video_mirrored = value; break; case 5: //Min depth _min_depth = value; break; case 6: //Max depth _max_depth = value; break; case 7: //Depth compression _depth_compression = value; break; case 8: //Video compression _video_compression = value; break; } break; case 1: //MOTOR switch(buff[1 + (i*6)]){ case 0: //MOVE freenect_sync_set_tilt_degs(value, 0); break; case 1: //LED COLOR freenect_sync_set_led((freenect_led_options) value, 0); break; case 2: //Accelerometer sendAccelerometers(); break; } break; } } } else { //Command was not multiple of 6 (we received an invalid command) if(!die) printf("got bad command (%d)\n", len ); client_connected = 0; } } if(!die) { printf("Disconecting client...\n"); freenect_network_wait(); //waiting for client led status freenect_sync_set_led((freenect_led_options) 4, 0); } return NULL; }
//Connection protocol handler void *connection_handler(void *arg) { int n, value; //send_policy_file(data_child); while(client_connected) { char buff[8*10]; //Command buffer #ifdef WIN32 //Listen for data (Winsock) n = recv(data_client_socket, (char*)buff, sizeof(buff), 0); #else //Listen for data (UNIX) n = read(data_child, buff, sizeof(buff)); #endif //If command length is multiple of 6 if(n > 0 && n % 6 == 0){ //Get the number of commands received int max = n / 6; int i; //For each command received for(i = 0; i < max; i++){ memcpy(&value, &buff[2 + (i*6)], sizeof(int)); value = ntohl(value); //The BIG switch (Communication protocol) switch(buff[0 + (i*6)]){ case 0: //CAMERA switch(buff[1 + (i*6)]){ case 0: //GET DEPTH sendDepth(); break; case 1: //GET RGB sendVideo(); break; case 2: //Mirror depth _depth_mirrored = value; break; case 3: //Mirror video _video_mirrored = value; break; case 4: //Min depth _min_depth = value; break; case 5: //Max depth _max_depth = value; break; } break; case 1: //MOTOR switch(buff[1 + (i*6)]){ case 0: //MOVE freenect_sync_set_tilt_degs(value, 0); break; case 1: //LED COLOR freenect_sync_set_led((freenect_led_options) value, 0); break; case 2: //Accelerometer sendAccelerometers(); break; } break; } } } else { //Command was not multiple of 6 (we received an invalid command) printf("got bad command (%d)\n", n); client_connected = 0; } } printf("Disconecting client...\n"); //waiting for client led status freenect_sync_set_led((freenect_led_options) 4, 0); return NULL; }