static jstring NativeIDN_convertImpl(JNIEnv* env, jclass, jstring s, jint flags, jboolean toAscii) { ScopedJavaUnicodeString sus(env, s); const UChar* src = sus.unicodeString().getBuffer(); const size_t srcLength = sus.unicodeString().length(); UChar dst[256]; UErrorCode status = U_ZERO_ERROR; size_t resultLength = toAscii ? uidna_IDNToASCII(src, srcLength, &dst[0], sizeof(dst), flags, NULL, &status) : uidna_IDNToUnicode(src, srcLength, &dst[0], sizeof(dst), flags, NULL, &status); if (U_FAILURE(status)) { jniThrowException(env, "java/lang/IllegalArgumentException", u_errorName(status)); return NULL; } if (!toAscii) { // ICU only translates separators to ASCII for toASCII. // Java expects the translation for toUnicode too. // We may as well do this here, while the string is still mutable. for (size_t i = 0; i < resultLength; ++i) { if (isLabelSeparator(dst[i])) { dst[i] = '.'; } } } return env->NewString(&dst[0], resultLength); }
void * clientHandler(void * arg) { threadStruct *inArg = (threadStruct *) arg; int sockfd = inArg->sockfd; free(inArg); char *msg = malloc(sizeof(char)*CMD_MAX_SIZE); *msg = '\0'; msgHeader header; User user; // Agregar usuario readBytes(sockfd, (void *) &header,sizeof(header)); readBytes(sockfd, (void *) msg, header.msgSize); cleanString(msg); user.sockfd = sockfd; strncpy(user.name,msg,NAMES_SIZE); *(user.name + NAMES_SIZE -1) = '\0'; list_append(&Users,(void *) &user); // Agregar a la sala default #! while (1) { // Leer un mensaje del cliente readBytes(sockfd, (void *) &header,sizeof(header)); readBytes(sockfd, (void *) msg, header.msgSize); cleanString(msg); switch (header.code) { case MSG_CODE_SHUT: break; // #! NOT DONE case MSG_CODE_SAL: sal(sockfd); break; case MSG_CODE_USU: usu(sockfd); break; case MSG_CODE_MEN: men(sockfd,msg); break; case MSG_CODE_SUS: sus(sockfd,msg); break; case MSG_CODE_DES: des(sockfd); break; case MSG_CODE_CRE: cre(sockfd,msg); break; case MSG_CODE_ELI: // eli() #! break; case MSG_CODE_FUE: fue(sockfd); free(msg); pthread_exit(NULL); break; } *msg = '\0'; } return NULL; }
void *connection_handler(void *td) { int sock = ((Thread_data *) td)->client_sock; list subscribed_rooms = ((Thread_data *) td)->subscribed_rooms; char msg[MAX_PACK_SIZE]; memset(msg, 0, MAX_PACK_SIZE); user_data *user = wait_username(rooms, sock); user->subscribed_rooms = subscribed_rooms; add(connected_users, user); add(subscribed_rooms, rooms->first); int read_size; while ((read_size = recv(sock, msg, MAX_PACK_SIZE, 0)) > 0) { pthread_mutex_lock(&mutex); if (read_size < 3) { } else if ((strlen(msg) >= 6) && (msg[3] == ' ') && (msg[0] == 's') && (msg[1] == 'u') && (msg[2] == 's')) { memmove(msg, msg+4, 252); msg[strlen(msg)-1] = '\0'; //replace new line sus(msg, user); } else if ((strlen(msg) == 4) && (msg[0] == 's') && (msg[1] == 'a') && (msg[2] == 'l')) { sal(sock); } else if ((strlen(msg) >= 6) && //because of new line (msg[3] == ' ') && (msg[0] == 'm') && (msg[1] == 'e') && (msg[2] == 'n')) { memmove(msg, msg+4, 252); msg[strlen(msg)-1] = '\0'; //replace new line men(user, subscribed_rooms, msg); } else if ((strlen(msg) == 4) && (msg[0] == 'u') && (msg[1] == 's') && (msg[2] == 'u')) { usu(sock); } else if ((strlen(msg) == 4) && (msg[0] == 'd') && (msg[1] == 'e') && (msg[2] == 's')) { des(subscribed_rooms, user); } else if ((strlen(msg) >= 6) && (msg[3] == ' ') && (msg[0] == 'c') && (msg[1] == 'r') && (msg[2] == 'e')) { memmove(msg, msg+4, 252); msg[strlen(msg)-1] = '\0'; //replace new line cre(sock, msg); } else if ((strlen(msg) >= 6) && (msg[3] == ' ') && (msg[0] == 'e') && (msg[1] == 'l') && (msg[2] == 'i')) { memmove(msg, msg+4, 252); msg[strlen(msg)-1] = '\0'; //replace new line eli(msg, sock, user); } else if ((strlen(msg) == 4) && (msg[0] == 'f') && (msg[1] == 'u') && (msg[2] == 'e')) { fue(subscribed_rooms, user); } else if ((strlen(msg) == 4) && (msg[0] == 'h') && (msg[1] == 'l') && (msg[2] == 'p')) { memset(msg, 0, MAX_PACK_SIZE); strcat(msg, "-----------\n"); strcat(msg, "The valids commands formats are:\n"); strcat(msg, "sus <room name>\n"); strcat(msg, "cre <room name>\n"); strcat(msg, "eli <room name>\n"); strcat(msg, "sal\n"); strcat(msg, "usu\n"); strcat(msg, "des\n"); strcat(msg, "fue\n"); strcat(msg, "-----------"); write(sock, msg, MAX_PACK_SIZE); } else { memset(msg, 0, MAX_PACK_SIZE); strcat(msg, "Unrecognized option."); strcat(msg, " Try `hlp' for more information."); write(sock, msg, MAX_PACK_SIZE); } memset(msg, 0, MAX_PACK_SIZE); pthread_mutex_unlock(&mutex); } }