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; } }
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; }
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; }
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)); }