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;
}
Beispiel #3
0
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;
}