/* Does a stringSet exist on disk? */ bool AP_Win32App::doesStringSetExist(const char* pLocale) { FILE* in; const char * szDirectory = NULL; UT_return_val_if_fail(pLocale, false); getPrefsValueDirectory(true,AP_PREF_KEY_StringSetDirectory,&szDirectory); UT_return_val_if_fail(((szDirectory) && (*szDirectory)), false); char * szPathname = (char *)UT_calloc(sizeof(char),strlen(szDirectory)+strlen(pLocale)+100); UT_return_val_if_fail(szPathname, false); sprintf(szPathname,"%s%s%s.strings", szDirectory, ((szDirectory[strlen(szDirectory)-1]=='\\') ? "" : "\\"), pLocale); in = fopen(szPathname, "r"); g_free (szPathname); if (in) { fclose(in); return true; } return false; }
/* Does a stringSet exist on disk? */ bool AP_Win32App::doesStringSetExist(const char* pLocale) { HANDLE in; const char * szDirectory = NULL; UT_return_val_if_fail(pLocale, false); getPrefsValueDirectory(true,AP_PREF_KEY_StringSetDirectory,&szDirectory); UT_return_val_if_fail(((szDirectory) && (*szDirectory)), false); char *szPathname = (char*) UT_calloc(sizeof(char),strlen(szDirectory)+strlen(pLocale)+100); UT_return_val_if_fail(szPathname, false); char *szDest = szPathname; strcpy(szDest, szDirectory); szDest += strlen(szDest); if ((szDest > szPathname) && (szDest[-1]!='\\')) *szDest++='\\'; lstrcpyA(szDest,pLocale); lstrcatA(szDest,".strings"); UT_Win32LocaleString wsFilename; wsFilename.fromUTF8(szPathname); in = CreateFileW(wsFilename.c_str(),0,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL); g_free (szPathname); if (in!=INVALID_HANDLE_VALUE) { CloseHandle(in); return true; } return false; }
/*! * Try loading a string-set. * \param szStringSet Language id, e.g. de_AT * \param pDefaultStringSet String set to be used for untranslated strings. * \return AP_DiskStringSet * on success, NULL if not found */ AP_DiskStringSet * AP_UnixApp::loadStringsFromDisk(const char * szStringSet, AP_BuiltinStringSet * pDefaultStringSet) { UT_ASSERT(pDefaultStringSet); const char * szDirectory = NULL; getPrefsValueDirectory(true, static_cast<const gchar*>(AP_PREF_KEY_StringSetDirectory), static_cast<const gchar**>(&szDirectory)); UT_return_val_if_fail((szDirectory) && (*szDirectory), NULL); UT_String szPathVariant[4]; char * p_strbuf = strdup(""); char * p_modifier = NULL; int cur_id = 0; bool three_letters = false; // some have 3! if (szStringSet) { FREEP(p_strbuf); p_strbuf = strdup(szStringSet); p_modifier = strrchr(p_strbuf,'@'); char t = szStringSet[2]; if (t && t!='-' && t!='@' && t!='_') three_letters = true; } if (p_modifier) { // [email protected] szPathVariant[cur_id] = szDirectory; if (szDirectory[strlen(szDirectory)-1]!='/') szPathVariant[cur_id] += "/"; szPathVariant[cur_id] += p_strbuf; szPathVariant[cur_id] += ".strings"; cur_id++; // [email protected] if (szStringSet && strlen(szStringSet) > 2) { szPathVariant[cur_id] = szDirectory; if (szDirectory[strlen(szDirectory)-1]!='/') szPathVariant[cur_id] += "/"; szPathVariant[cur_id] += p_strbuf[0]; szPathVariant[cur_id] += p_strbuf[1]; if (three_letters) szPathVariant[cur_id] += p_strbuf[2]; szPathVariant[cur_id] += p_modifier; szPathVariant[cur_id] += ".strings"; } cur_id++; // trim modifier part *p_modifier = 0; } // fo_BA.strings UT_String szPath = szDirectory; if (szDirectory[szPath.size()-1]!='/') szPath += "/"; szPath += p_strbuf; szPath += ".strings"; // fo.strings UT_String szFallbackPath; if (szStringSet && strlen(szStringSet) > 2) { szFallbackPath = szDirectory; if (szDirectory[szFallbackPath.size()-1]!='/') szFallbackPath += "/"; szFallbackPath += p_strbuf[0]; szFallbackPath += p_strbuf[1]; if (three_letters) szFallbackPath += p_strbuf[2]; szFallbackPath += ".strings"; } AP_DiskStringSet * pDiskStringSet = new AP_DiskStringSet(this); FREEP(p_strbuf); // trying to load specific strings first for (int i=0; i<cur_id; i++) { if (pDiskStringSet->loadStringsFromDisk(szPathVariant[i].c_str())) { pDiskStringSet->setFallbackStringSet(pDefaultStringSet); UT_DEBUGMSG(("Using [v] StringSet [%s]\n",szPathVariant[i].c_str())); return pDiskStringSet; } } // then generic ones if (pDiskStringSet->loadStringsFromDisk(szPath.c_str())) { pDiskStringSet->setFallbackStringSet(pDefaultStringSet); UT_DEBUGMSG(("Using StringSet [%s]\n",szPath.c_str())); return pDiskStringSet; } else if (szFallbackPath.size() && pDiskStringSet->loadStringsFromDisk(szFallbackPath.c_str())) { pDiskStringSet->setFallbackStringSet(pDefaultStringSet); UT_DEBUGMSG(("Using StringSet [%s]\n",szFallbackPath.c_str())); return pDiskStringSet; } else { DELETEP(pDiskStringSet); UT_DEBUGMSG(("Unable to load StringSet [%s] -- using builtin strings instead.\n",szPath.c_str())); return NULL; } }
bool AP_Win32App::initialize(void) { bool bSuccess = true; const char * szUserPrivateDirectory = getUserPrivateDirectory(); bool bVerified = s_createDirectoryIfNecessary(szUserPrivateDirectory); UT_return_val_if_fail (bVerified, false); // create templates directory UT_String sTemplates = szUserPrivateDirectory; sTemplates += "/templates"; s_createDirectoryIfNecessary(sTemplates.c_str()); // load the preferences. m_prefs = new AP_Win32Prefs(); UT_return_val_if_fail (m_prefs, false); m_prefs->fullInit(); // now that preferences are established, let the xap init m_pClipboard = new AP_Win32Clipboard(); UT_return_val_if_fail (m_pClipboard, false); m_pEMC = AP_GetEditMethods(); UT_return_val_if_fail (m_pEMC, false); m_pBindingSet = new AP_BindingSet(m_pEMC); UT_return_val_if_fail (m_pBindingSet, false); m_pMenuActionSet = AP_CreateMenuActionSet(); UT_return_val_if_fail (m_pMenuActionSet,false); m_pToolbarActionSet = AP_CreateToolbarActionSet(); UT_return_val_if_fail (m_pToolbarActionSet,false); ////////////////////////////////////////////////////////////////// // load the dialog and message box strings ////////////////////////////////////////////////////////////////// { // assume we will be using the builtin set (either as the main // set or as the fallback set). AP_BuiltinStringSet * pBuiltinStringSet = new AP_BuiltinStringSet(this,AP_PREF_DEFAULT_StringSet); UT_return_val_if_fail (pBuiltinStringSet, false); m_pStringSet = pBuiltinStringSet; // see if we should load an alternate set from the disk const char * szDirectory = NULL; const char * szStringSet = NULL; if ( (getPrefsValue(AP_PREF_KEY_StringSet,&szStringSet)) && (szStringSet) && (*szStringSet) && (g_ascii_strcasecmp(szStringSet,AP_PREF_DEFAULT_StringSet) != 0)) { getPrefsValueDirectory(true,AP_PREF_KEY_StringSetDirectory,&szDirectory); UT_return_val_if_fail ((szDirectory) && (*szDirectory), false); char * szPathname = (char *)UT_calloc(sizeof(char),strlen(szDirectory)+strlen(szStringSet)+100); UT_return_val_if_fail (szPathname, false); sprintf(szPathname,"%s%s%s.strings", szDirectory, ((szDirectory[strlen(szDirectory)-1]=='\\') ? "" : "\\"), szStringSet); AP_DiskStringSet * pDiskStringSet = new AP_DiskStringSet(this); UT_return_val_if_fail (pDiskStringSet, false); if (pDiskStringSet->loadStringsFromDisk(szPathname)) { pDiskStringSet->setFallbackStringSet(m_pStringSet); m_pStringSet = pDiskStringSet; UT_Language_updateLanguageNames(); UT_DEBUGMSG(("Using StringSet [%s]\n",szPathname)); } else { UT_DEBUGMSG(("Unable to load StringSet [%s] -- using builtin strings instead.\n",szPathname)); DELETEP(pDiskStringSet); } g_free(szPathname); } } // AP_App::initilize() calls for us XAP_Win32App::initialize() if (! AP_App::initialize()) return false; // let various window types register themselves if (!AP_Win32Frame::RegisterClass(this)) { UT_DEBUGMSG(("couldn't register class\n")); return false; } ////////////////////////////////////////////////////////////////// // Initialize the importers/exporters ////////////////////////////////////////////////////////////////// IE_ImpExp_RegisterXP (); ////////////////////////////////////////////////////////////////// // initializes the spell checker. ////////////////////////////////////////////////////////////////// { #if ENABLE_SPELL SpellManager::instance(); #endif } // Now we have the strings loaded we can populate the field names correctly int i; for (i = 0; fp_FieldTypes[i].m_Type != FPFIELDTYPE_END; i++) { (&fp_FieldTypes[i])->m_Desc = m_pStringSet->getValue(fp_FieldTypes[i].m_DescId); UT_DEBUGMSG(("Setting field type desc for type %d, desc=%s\n", fp_FieldTypes[i].m_Type, fp_FieldTypes[i].m_Desc)); } for (i = 0; fp_FieldFmts[i].m_Tag != NULL; i++) { (&fp_FieldFmts[i])->m_Desc = m_pStringSet->getValue(fp_FieldFmts[i].m_DescId); UT_DEBUGMSG(("Setting field desc for field %s, desc=%s\n", fp_FieldFmts[i].m_Tag, fp_FieldFmts[i].m_Desc)); } /////////////////////////////////////////////////////////////////////// /// Build a labelset so the plugins can add themselves to something /// /////////////////////////////////////////////////////////////////////// const char * szMenuLabelSetName = NULL; if (getPrefsValue( AP_PREF_KEY_StringSet, (const gchar**)&szMenuLabelSetName) && (szMenuLabelSetName) && (*szMenuLabelSetName)) { ; } else szMenuLabelSetName = AP_PREF_DEFAULT_StringSet; getMenuFactory()->buildMenuLabelSet(szMenuLabelSetName); ////////////////////////////////////////////////////////////////// // Check for necessary DLLs now that we can do localized error messages ////////////////////////////////////////////////////////////////// // Ensure that common control DLL is loaded HINSTANCE hinstCC = LoadLibraryW(L"comctl32.dll"); UT_return_val_if_fail (hinstCC, false); InitCommonControlsEx_fn pInitCommonControlsEx = NULL; if( hinstCC != NULL ) pInitCommonControlsEx = (InitCommonControlsEx_fn)GetProcAddress( hinstCC, "InitCommonControlsEx"); if( pInitCommonControlsEx != NULL ) { INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES // load the rebar and toolbar | ICC_TAB_CLASSES | ICC_UPDOWN_CLASS // and tab and spin controls | ICC_STANDARD_CLASSES; pInitCommonControlsEx(&icex); } else { InitCommonControls(); UT_Win32LocaleString err; err.fromUTF8 (m_pStringSet->getValue(AP_STRING_ID_WINDOWS_COMCTL_WARNING)); MessageBoxW(NULL, err.c_str(), NULL, MB_OK); } ////////////////////////////////////////////////////////////////// // load the all Plugins from the correct directory ////////////////////////////////////////////////////////////////// #ifndef DISABLE_BUILTIN_PLUGINS abi_register_builtin_plugins(); #endif bool bLoadPlugins = true; bool bFound = getPrefsValueBool(XAP_PREF_KEY_AutoLoadPlugins,&bLoadPlugins); if(bLoadPlugins || !bFound) { WCHAR szPath[PATH_MAX]; WCHAR szPlugin[PATH_MAX]; _getExeDir( szPath, PATH_MAX); #ifdef _MSC_VER lstrcatW(szPath, L"..\\plugins\\*.dll"); #else #define ABI_WIDE_STRING(t) L ## t lstrcatW(szPath, ABI_WIDE_STRING("..\\lib\\" PACKAGE L"-" ABIWORD_SERIES L"\\plugins\\*.dll")); #endif WIN32_FIND_DATAW cfile; HANDLE findtag = FindFirstFileW( szPath, &cfile ); if( findtag != INVALID_HANDLE_VALUE ) { do { _getExeDir( szPlugin, PATH_MAX ); #ifdef _MSC_VER lstrcatW( szPlugin, L"..\\plugins\\" ); #else lstrcatW( szPlugin, ABI_WIDE_STRING("..\\lib\\" PACKAGE L"-" ABIWORD_SERIES L"\\plugins\\" )); #endif lstrcatW( szPlugin, cfile.cFileName ); XAP_ModuleManager::instance().loadModule( getUTF8String(szPlugin) ); } while( FindNextFileW ( findtag, &cfile ) ); FindClose( findtag ); } UT_String pluginName( getUserPrivateDirectory() ); UT_String pluginDir( getUserPrivateDirectory() ); pluginDir += "\\AbiWord\\plugins\\*.dll"; UT_Win32LocaleString str; str.fromUTF8(pluginDir.c_str()); findtag = FindFirstFileW( str.c_str(), &cfile ); if( findtag != INVALID_HANDLE_VALUE ) { do { pluginName = getUserPrivateDirectory(); pluginName += "\\AbiWord\\plugins\\"; pluginName += getUTF8String(cfile.cFileName); XAP_ModuleManager::instance().loadModule( pluginName.c_str() ); } while( FindNextFileW( findtag, &cfile ) ); FindClose( findtag ); } } return bSuccess; }