JError JCreateTempFile ( const JCharacter* path, const JCharacter* prefix, JString* fullName ) { JString p; if (!JStringEmpty(path)) { p = path; } else if (!JGetTempDirectory(&p)) { return JDirEntryDoesNotExist("/tmp"); } if (!JStringEmpty(prefix)) { p = JCombinePathAndName(p, prefix); } else { p = JCombinePathAndName(p, "temp_file_"); } p += "XXXXXX"; char* s = p.AllocateCString(); jclear_errno(); int fd = mkstemp(s); if (fd != -1) { close(fd); *fullName = s; delete [] s; return JNoError(); } fullName->Clear(); delete [] s; // EINVAL counts as unexpected const int err = jerrno(); if (err == EEXIST) { return JAccessDenied(p); } else { return JUnexpectedError(err); } }
JString JGetUniqueDirEntryName ( const JCharacter* path, const JCharacter* namePrefix, const JCharacter* nameSuffix, const JIndex startIndex ) { assert( !JStringEmpty(namePrefix) ); JString fullPath; if (JStringEmpty(path)) { if (!JGetTempDirectory(&fullPath)) { fullPath = JGetCurrentDirectory(); } } else { const JBoolean ok = JConvertToAbsolutePath(path, NULL, &fullPath); assert( ok ); } assert( JDirectoryExists(fullPath) ); const JString prefix = JCombinePathAndName(fullPath, namePrefix); JString name; for (JIndex i=startIndex; i<=kJIndexMax; i++) { name = prefix; if (i > 1) { name += JString(i, JString::kBase10); } if (!JStringEmpty(nameSuffix)) { name += nameSuffix; } if (!JNameUsed(name)) { break; } } return name; }
JError JCreateTempDirectory ( const JCharacter* path, const JCharacter* prefix, JString* fullName ) { JString p; if (!JStringEmpty(path)) { p = path; } else if (!JGetTempDirectory(&p)) { return JDirEntryDoesNotExist("/tmp"); } if (!JStringEmpty(prefix)) { p = JCombinePathAndName(p, prefix); } else { p = JCombinePathAndName(p, "temp_dir_"); } p += "XXXXXX"; char* s = p.AllocateCString(); jclear_errno(); char* d = mkdtemp(s); if (d != NULL) { *fullName = s; JAppendDirSeparator(fullName); delete [] s; return JNoError(); } fullName->Clear(); delete [] s; // EINVAL counts as unexpected const int err = jerrno(); if (err == EEXIST) { return JDirEntryAlreadyExists(p); } else if (err == EFAULT) { return JSegFault(); } else if (err == EACCES) { return JAccessDenied(p); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(p); } else if (err == ENOTDIR) { return JComponentNotDirectory(p); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == EROFS) { return JFileSystemReadOnly(); } else if (err == ELOOP) { return JPathContainsLoop(p); } else if (err == ENOSPC) { return JFileSystemFull(); } else { return JUnexpectedError(err); } }
void JInitCore ( JAssertBase* ah, const JCharacter* appSignature, const JCharacter** defaultStringData, JUserNotification* un, JChooseSaveFile* csf, JCreateProgressDisplay* cpg, JGetCurrentFontManager* gcfm, JGetCurrentColormap* gcc, const JCharacter* defaultFontName, const JCharacter* greekFontName, const JCharacter* monospaceFontName ) { // assert handler if (ah != NULL) { theAssertHandler = ah; } // NULL is valid in this case -- see JGetAssertHandler() // socket library (mainly Windows) ACE_OS::socket_init(); // signal handler JThisProcess::Initialize(); // initialize write-once/read-many static data for thread safety JString s; JGetTempDirectory(&s); // string manager JStringManager* stringMgr = JGetStringManager(); // create it if (defaultStringData != NULL) { stringMgr->Register(appSignature, defaultStringData); } // user notification if (un != NULL) { theUserNotification = un; } else { theUserNotification = new JTextUserNotification; assert( theUserNotification != NULL ); } // choose/save file if (csf != NULL) { theChooseSaveFile = csf; } else { theChooseSaveFile = new JTextChooseSaveFile; assert( theChooseSaveFile != NULL ); } // progress display factory if (cpg != NULL) { theCreatePG = cpg; } else { theCreatePG = new JCreateTextPG; assert( theCreatePG != NULL ); } // font manager if (gcfm != NULL) { theGetCurrFontMgr = gcfm; } // colormap if (gcc != NULL) { theGetCurrColormap = gcc; } // default font name if (!JStringEmpty(defaultFontName)) { theDefaultFontName = new JString(defaultFontName); assert( theDefaultFontName != NULL ); } // greek font name if (!JStringEmpty(greekFontName)) { theGreekFontName = new JString(greekFontName); assert( theGreekFontName != NULL ); } // monospace font name if (!JStringEmpty(monospaceFontName)) { theMonospaceFontName = new JString(monospaceFontName); assert( theMonospaceFontName != NULL ); } // remember to clean up atexit(JDeleteGlobals); }