JNIEXPORT jstring JNICALL Java_org_adaptinet_sdk_fastcache_DataArray_getString(JNIEnv *env, jobject _this, jlong idx)
{
	DATAARRAY * pda = getDataArray(env, _this);
	DATATYPE dt;
	DataArrayGetDatatype(pda, &dt);
	if(dt==DT_DATAITEM) 
	{
	    DATAITEM di;
	    DataItemInit(&di);
	    DataArrayGetElement(pda, (unsigned long *)&idx, &di);
	    if(!DataItemChangeType(&di, DT_SSTR)) 
		{
			return 0;
		}

		return env->NewStringUTF(GetAnsiString(di.sstringVal));
	} 
	else if(dt==DT_SSTR) 
	{
		SString bs = 0;
		DataArrayGetElement(pda, (unsigned long *)&idx, &bs);
		jstring js = env->NewStringUTF(GetAnsiString(bs));
		return js;
	}
	ThrowFastCacheException(env, "dataarray cannot get string", 0);
	return 0;
}
JNIEXPORT jobjectArray JNICALL Java_org_adaptinet_sdk_fastcache_DataArray_toStringArray(JNIEnv *env, jobject _this)
{
	DATAARRAY *da = getDataArray(env, _this);
	int num = DataArrayGetElemsize(da);
	DATATYPE dt;
	DataArrayGetDatatype(da, &dt);
	if(dt==DT_DATAITEM) 
	{
		jobjectArray iarr = env->NewObjectArray(num, sClass, 0);
		DATAITEM di;
		DataItemInit(&di);
		for(int i=0;i<num;i++) 
		{
			unsigned long ix = i;
			DataArrayGetElement(da, &ix, (void*) &di);
			if(!DataItemChangeType(&di, DT_SSTR))
			{
				return 0;
			}
			SString bs = di.sstringVal;
			jstring js = env->NewStringUTF(GetAnsiString(bs));
			env->SetObjectArrayElement(iarr, i, js);
		}
		return iarr;
	} 
	else if(dt==DT_SSTR) 
	{
	    jobjectArray iarr = env->NewObjectArray(num, sClass, 0);
	    for(int i=0;i<=num;i++) 
		{
			SString bs = 0;
			unsigned long ix = i;
			DataArrayGetElement(da, &ix, (void*) &bs);
			jstring js = env->NewStringUTF(GetAnsiString(bs));
			env->SetObjectArrayElement(iarr, i, js);
		}
		return iarr;
	}
	ThrowFastCacheException(env, "dataarray cannot be converted to string[]", 0);
	return 0;
}
JNIEXPORT void JNICALL Java_org_adaptinet_sdk_fastcache_DataArray_getStrings(JNIEnv *env, jobject _this, jlong idx, jint nelem, jobjectArray ja, jint ja_start)
{
	DATAARRAY *da = getDataArray(env, _this);
	int num = DataArrayGetElemsize(da);

	DATATYPE dt; 
	DataArrayGetDatatype(da, &dt); 
	if(dt==DT_DATAITEM) 
	{
		DATAITEM di;
		for(int i=0, j=ja_start;i<num;i++,j++) 
		{
			unsigned long ix = i;
			DataArrayGetElement(da, &ix, (void*) &di);
			if(!DataItemChangeType(&di, DT_SSTR))
			{
				return;
			}
			jstring js = env->NewStringUTF(GetAnsiString(di.sstringVal));
			env->SetObjectArrayElement(ja, j, js);
			DataItemClear(&di);
		} 
	}
	else if(dt==DT_SSTR) 
	{
		SString bs = 0;
		for(int i=idx, j=ja_start;i<idx+nelem;i++,j++) 
		{
			unsigned long ix = i;
			DataArrayGetElement(da, &ix, (void*) &bs);
			jstring js = env->NewStringUTF(GetAnsiString(bs));
			env->SetObjectArrayElement(ja, j, js);
		} 
	} 
	else 
	{
		ThrowFastCacheException(env, "dataarray cannot get strings", 0);
		return;
	}
}
Exemple #4
0
int OldGetFileString::GetString(wchar_t **DestStr, int nCodePage, int &Length)
{
    int nExitCode;

    if (nCodePage == CP_UNICODE) //utf-16
        nExitCode = GetUnicodeString(DestStr, Length, false);
    else if (nCodePage == CP_REVERSEBOM)
        nExitCode = GetUnicodeString(DestStr, Length, true);
    else
    {
        char *Str;
        nExitCode = GetAnsiString(&Str, Length);

        if (nExitCode == 1)
        {
            DWORD ret = ERROR_SUCCESS;
            int nResultLength = 0;
            bool bGet = false;
            *wStr = L'\0';

            if (!SomeDataLost)
            {
                // при CP_UTF7 dwFlags должен быть 0, см. MSDN
                nResultLength = MultiByteToWideChar(
                                    nCodePage,
                                    (SomeDataLost || nCodePage==CP_UTF7) ? 0 : MB_ERR_INVALID_CHARS,
                                    Str,
                                    Length,
                                    wStr,
                                    m_nwStrLength - 1
                                );

                if (!nResultLength)
                {
                    ret = GetLastError();

                    if (ERROR_NO_UNICODE_TRANSLATION == ret)
                    {
                        SomeDataLost = true;
                        bGet = true;
                    }
                }
            }
            else
                bGet = true;

            if (bGet)
            {
                nResultLength = MultiByteToWideChar(nCodePage, 0, Str, Length, wStr, m_nwStrLength - 1);

                if (!nResultLength)
                    ret = GetLastError();
            }

            if (ERROR_INSUFFICIENT_BUFFER == ret)
            {
                nResultLength = MultiByteToWideChar(nCodePage, 0, Str, Length, nullptr, 0);
                wStr = (wchar_t*)xf_realloc_nomove(wStr, (nResultLength + 1) * sizeof(wchar_t));
                *wStr = L'\0';
                m_nwStrLength = nResultLength+1;
                nResultLength = MultiByteToWideChar(nCodePage, 0, Str, Length, wStr, nResultLength);
            }

            if (nResultLength)
                wStr[nResultLength] = L'\0';

            Length = nResultLength;
            *DestStr = wStr;
        }
    }

    return nExitCode;
}
Exemple #5
0
int GetFileString::GetString(LPWSTR* DestStr, UINT nCodePage, int& Length)
{
    if(Peek)
    {
        Peek = false;
        DestStr = LastString;
        Length = LastLength;
        return LastResult;
    }
    int nExitCode;

    if (nCodePage == CP_UNICODE) //utf-16
    {
        nExitCode = GetUnicodeString(DestStr, Length, false);
    }
    else if (nCodePage == CP_REVERSEBOM)
    {
        nExitCode = GetUnicodeString(DestStr, Length, true);
    }
    else
    {
        char *Str;
        nExitCode = GetAnsiString(&Str, Length);

        if (nExitCode == 1)
        {
            DWORD Result = ERROR_SUCCESS;
            int nResultLength = 0;
            bool bGet = false;
            *wStr = L'\0';

            if (!SomeDataLost)
            {
                // при CP_UTF7 dwFlags должен быть 0, см. MSDN
                nResultLength = MultiByteToWideChar(nCodePage, (SomeDataLost || nCodePage==CP_UTF7) ? 0 : MB_ERR_INVALID_CHARS, Str, Length, wStr, m_nwStrLength - 1);

                if (!nResultLength)
                {
                    Result = GetLastError();
                    if (Result == ERROR_NO_UNICODE_TRANSLATION)
                    {
                        SomeDataLost = true;
                        bGet = true;
                    }
                }
            }
            else
            {
                bGet = true;
            }
            if (bGet)
            {
                nResultLength = MultiByteToWideChar(nCodePage, 0, Str, Length, wStr, m_nwStrLength - 1);
                if (!nResultLength)
                {
                    Result = GetLastError();
                }
            }
            if (Result == ERROR_INSUFFICIENT_BUFFER)
            {
                nResultLength = MultiByteToWideChar(nCodePage, 0, Str, Length, nullptr, 0);
                wStr = static_cast<LPWSTR>(xf_realloc_nomove(wStr, (nResultLength + 1) * sizeof(wchar_t)));
                *wStr = L'\0';
                m_nwStrLength = nResultLength+1;
                nResultLength = MultiByteToWideChar(nCodePage, 0, Str, Length, wStr, nResultLength);
            }
            if (nResultLength)
            {
                wStr[nResultLength] = L'\0';
            }
            Length = nResultLength;
            *DestStr = wStr;
        }
    }
    return nExitCode;
}
Exemple #6
0
void StdStringTest::testStdString()
{
    //GetAnsiString
    std::string strAnsi = GetAnsiString(L"hello");
    CPPUNIT_ASSERT(strAnsi == "hello");
    strAnsi = GetAnsiString(L"");
    CPPUNIT_ASSERT(strAnsi == "");

    //GetWideString
    std::wstring strWide = GetWideString("hello");
    CPPUNIT_ASSERT(strWide == L"hello");
    strWide = GetWideString(L"");
    CPPUNIT_ASSERT(strWide == L"");

    //GetCStyleAnsiString
    char szBuf[64] = {0};
    const char* pTmp = GetCStyleAnsiString("hello", szBuf);
    CPPUNIT_ASSERT_EQUAL(0, lstrcmpA(pTmp, "hello"));
    pTmp = GetCStyleAnsiString("", szBuf);
    CPPUNIT_ASSERT_EQUAL(0, lstrlenA(pTmp));

    //GetCStyleWideString
    wchar_t szBuf2[64] = {0};
    const wchar_t* pTmp2 = GetCStyleWideString(L"hello", szBuf2);
    CPPUNIT_ASSERT_EQUAL(0, lstrcmpW(pTmp2, L"hello"));
    pTmp2 = GetCStyleWideString(L"", szBuf2);
    CPPUNIT_ASSERT_EQUAL(0, lstrlenW(pTmp2));

    //Split
    std::string strDel = " \t";
    strAnsi = " a\t hello                         world         ";
    std::list<std::string> rgpRet;
    int nVal = Split(strAnsi, strDel, rgpRet);
    CPPUNIT_ASSERT(3 == nVal);
    CPPUNIT_ASSERT(3u == rgpRet.size());

    std::list<std::string>::iterator iter = rgpRet.begin();
    CPPUNIT_ASSERT(*iter == "a");
    iter++;
    CPPUNIT_ASSERT(*iter == "hello");
    iter++;
    CPPUNIT_ASSERT(*iter == "world");
    
    //Trim
    strAnsi = "     \t a evil world                     \t               ";
    strAnsi = TrimLeft(strAnsi, strDel);
    CPPUNIT_ASSERT(strAnsi == "a evil world                     \t               ");
    strAnsi = "     \t a evil world                     \t               ";
    strAnsi = TrimRight(strAnsi, strDel);
    CPPUNIT_ASSERT(strAnsi == "     \t a evil world");
    strAnsi = "     \t a evil world                     \t               ";
    strAnsi = Trim(strAnsi, strDel);
    CPPUNIT_ASSERT(strAnsi == "a evil world");

    //StartsWith
    strAnsi = "this is a world";
    strDel = "this";
    CPPUNIT_ASSERT(StartsWith(strAnsi, strDel));
    strDel = "his";
    CPPUNIT_ASSERT(!StartsWith(strAnsi, strDel));

    //EndsWith
    strDel = "world";
    CPPUNIT_ASSERT(EndsWith(strAnsi, strDel));
    strDel = "his";
    CPPUNIT_ASSERT(!EndsWith(strAnsi, strDel));

    //Contains
    strDel = "is";
    CPPUNIT_ASSERT(Contains(strAnsi, strDel));
    strDel = "his name";
    CPPUNIT_ASSERT(!Contains(strAnsi, strDel));

}