jobjectArray dnd_target_get_mimes(JNIEnv *env) { if (check_state_in_drag(env)) { return NULL; } if (!enter_ctx.mimes) { GList* targets = GLASS_GDK_DRAG_CONTEXT_LIST_TARGETS(enter_ctx.ctx); jobject set = env->NewObject(jHashSetCls, jHashSetInit, NULL); while (targets) { GdkAtom target = GDK_POINTER_TO_ATOM(targets->data); gchar *name = gdk_atom_name(target); if (target_is_text(target)) { env->CallBooleanMethod(set, jSetAdd, env->NewStringUTF("text/plain"), NULL); } if (target_is_image(target)) { env->CallBooleanMethod(set, jSetAdd, env->NewStringUTF("application/x-java-rawimage"), NULL); } if (target_is_uri(target)) { selection_data_ctx ctx; if (dnd_target_receive_data(env, TARGET_MIME_URI_LIST_ATOM, &ctx)) { gchar** uris = g_uri_list_extract_uris((gchar *) ctx.data); guint size = g_strv_length(uris); guint files_cnt = get_files_count(uris); if (files_cnt) { env->CallBooleanMethod(set, jSetAdd, env->NewStringUTF("application/x-java-file-list"), NULL); } if (size - files_cnt) { env->CallBooleanMethod(set, jSetAdd, env->NewStringUTF("text/uri-list"), NULL); } g_strfreev(uris); } g_free(ctx.data); } else { env->CallBooleanMethod(set, jSetAdd, env->NewStringUTF(name), NULL); } g_free(name); targets = targets->next; } enter_ctx.mimes = env->NewObjectArray(env->CallIntMethod(set, jSetSize, NULL), jStringCls, NULL); enter_ctx.mimes = (jobjectArray)env->CallObjectMethod(set, jSetToArray, enter_ctx.mimes, NULL); enter_ctx.mimes = (jobjectArray)env->NewGlobalRef(enter_ctx.mimes); } return enter_ctx.mimes; }
/* * Class: com_sun_glass_ui_gtk_GtkSystemClipboard * Method: mimesFromSystem * Signature: ()[Ljava/lang/String; */ JNIEXPORT jobjectArray JNICALL Java_com_sun_glass_ui_gtk_GtkSystemClipboard_mimesFromSystem (JNIEnv * env, jobject obj) { GdkAtom *targets; gint ntargets; gint i; GdkAtom *convertible; GdkAtom *convertible_ptr; gchar *name; jobjectArray result; jstring tmpString; init_atoms(); gtk_clipboard_wait_for_targets(get_clipboard(), &targets, &ntargets); convertible = (GdkAtom*) glass_try_malloc0_n(ntargets * 2, sizeof(GdkAtom)); //theoretically, the number can double if (!convertible) { if (ntargets > 0) { glass_throw_oom(env, "Failed to allocate mimes"); } g_free(targets); return NULL; } convertible_ptr = convertible; bool uri_list_added = false; bool text_added = false; bool image_added = false; for (i = 0; i < ntargets; ++i) { //handle text targets //if (targets[i] == TEXT_TARGET || targets[i] == STRING_TARGET || targets[i] == UTF8_STRING_TARGET) { if (gtk_targets_include_text(targets + i, 1) && !text_added) { *(convertible_ptr++) = MIME_TEXT_PLAIN_TARGET; text_added = true; } else if (gtk_targets_include_image(targets + i, 1, TRUE) && !image_added) { *(convertible_ptr++) = MIME_JAVA_IMAGE; image_added = true; } //TODO text/x-moz-url ? RT-17802 if (targets[i] == MIME_TEXT_URI_LIST_TARGET) { if (uri_list_added) { continue; } gchar** uris = gtk_clipboard_wait_for_uris(get_clipboard()); if (uris) { guint size = g_strv_length(uris); guint files_cnt = get_files_count(uris); if (files_cnt) { *(convertible_ptr++) = MIME_FILES_TARGET; } if (size - files_cnt) { *(convertible_ptr++) = MIME_TEXT_URI_LIST_TARGET; } g_strfreev(uris); } uri_list_added = true; } else { *(convertible_ptr++) = targets[i]; } } result = env->NewObjectArray(convertible_ptr - convertible, jStringCls, NULL); for (i = 0; convertible + i < convertible_ptr; ++i) { name = gdk_atom_name(convertible[i]); tmpString = env->NewStringUTF(name); env->SetObjectArrayElement(result, (jsize)i, tmpString); g_free(name); } g_free(targets); g_free(convertible); return result; }
int ZipDir( const WCHAR* dir, const WCHAR* outputFile, const OnProgressCallback* progress, bool sorted, int method, int compressionLevel ) { if ( ( dir != NULL ) && ( outputFile != NULL ) ) { deque<wstring> StringDeque; deque<wstring> zipDeque; StringDeque.push_back( wstring( dir ) ); wstring zipDir; wstring file; wstring zipFileName; wstring szText; zipFile zf = zipOpenHelp(outputFile); zip_fileinfo zi; zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; zi.dosDate = 0; zi.internal_fa = 0; zi.external_fa = 0; #if defined(_WIN32) || defined (_WIN64) SYSTEMTIME currTime; GetLocalTime( &currTime ); zi.tmz_date.tm_sec = currTime.wSecond; zi.tmz_date.tm_min = currTime.wMinute; zi.tmz_date.tm_hour = currTime.wHour; zi.tmz_date.tm_mday = currTime.wDay; zi.tmz_date.tm_mon = currTime.wMonth; zi.tmz_date.tm_year = currTime.wYear; #endif unsigned int filesCount = get_files_count( dir ); unsigned int currentFileIndex = 0; while ( !StringDeque.empty() ) { szText = StringDeque.front(); StringDeque.pop_front(); if(zipDeque.size() > 0) { zipDir = zipDeque.front() + wstring( L"/" ); zipDeque.pop_front(); } std::vector<std::wstring> aCurFiles = NSDirectory::GetFiles(szText); std::vector<std::wstring> aCurDirectories = NSDirectory::GetDirectories(szText); if (sorted) { std::sort(aCurFiles.begin(), aCurFiles.end()); std::sort(aCurDirectories.begin(), aCurDirectories.end()); } for(size_t i = 0; i < aCurDirectories.size(); ++i) { std::wstring sDirName = NSSystemPath::GetFileName(aCurDirectories[i]); StringDeque.push_back( aCurDirectories[i] ); zipDeque.push_back( zipDir + sDirName ); } for (size_t i = 0; i < aCurFiles.size(); ++i) { std::wstring cFileName = NSSystemPath::GetFileName(aCurFiles[i]); if (std::wstring::npos != cFileName.find(L"mimetype")) // возможно и полное соответствие { file = NSSystemPath::Combine(szText, cFileName); zipFileName = zipDir + cFileName; oneZipFile(zf, zi, file, zipFileName, 0, compressionLevel); aCurFiles.erase(aCurFiles.begin() + i, aCurFiles.begin() + i + 1); break; } } for (size_t i = 0; i < aCurFiles.size(); ++i) { std::wstring cFileName = NSSystemPath::GetFileName(aCurFiles[i]); file = NSSystemPath::Combine(szText, cFileName); zipFileName = zipDir + cFileName; oneZipFile(zf, zi, file, zipFileName, method, compressionLevel); if ( progress != NULL ) { short cancel = 0; long progressValue = ( 1000000 / filesCount * currentFileIndex ); if(NULL != progress) (*progress)( UTILS_ONPROGRESSEVENT_ID, progressValue, &cancel ); if ( cancel != 0 ) { zipClose( zf, NULL ); } } currentFileIndex++; } } zipClose( zf, NULL ); if ( progress != NULL ) { short cancel = 0; long progressValue = 1000000; if(NULL != progress) (*progress)( UTILS_ONPROGRESSEVENT_ID, progressValue, &cancel ); } } return 0; }