⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macstore.c

📁 大名鼎鼎的远程登录软件putty的Symbian版源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id: macstore.c,v 1.1.1.1 2003/06/02 15:55:41 pekangas Exp $ *//* * macstore.c: Macintosh-specific impementation of the interface * defined in storage.h */#include <MacTypes.h>#include <Folders.h>#include <Memory.h>#include <Resources.h>#include <TextUtils.h>#include <stdio.h>#include <string.h>#include "putty.h"#include "storage.h"#include "mac.h"#include "macresid.h"OSErr FSpGetDirID(FSSpec *f, long *idp, Boolean makeit);/* * We store each session as a file in the "PuTTY" sub-directory of the * preferences folder.  Each (key,value) pair is stored as a resource. */OSErr get_putty_dir(Boolean makeit, short *pVRefNum, long *pDirID){    OSErr error = noErr;    short prefVRefNum;    FSSpec puttydir;    long prefDirID, puttyDirID;    error = FindFolder(kOnSystemDisk, kPreferencesFolderType, makeit,		       &prefVRefNum, &prefDirID);    if (error != noErr) goto out;    error = FSMakeFSSpec(prefVRefNum, prefDirID, "\pPuTTY", &puttydir);    if (error != noErr && error != fnfErr) goto out;    error = FSpGetDirID(&puttydir, &puttyDirID, makeit);    if (error != noErr) goto out;    *pVRefNum = prefVRefNum;    *pDirID = puttyDirID;  out:    return error;}OSErr get_session_dir(Boolean makeit, short *pVRefNum, long *pDirID) {    OSErr error = noErr;    short puttyVRefNum;    FSSpec sessdir;    long puttyDirID, sessDirID;    error = get_putty_dir(makeit, &puttyVRefNum, &puttyDirID);    if (error != noErr) goto out;    error = FSMakeFSSpec(puttyVRefNum, puttyDirID, "\pSaved Sessions",			 &sessdir);    if (error != noErr && error != fnfErr) goto out;    error = FSpGetDirID(&sessdir, &sessDirID, makeit);    if (error != noErr) goto out;    *pVRefNum = puttyVRefNum;    *pDirID = sessDirID;  out:    return error;}OSErr FSpGetDirID(FSSpec *f, long *idp, Boolean makeit) {    CInfoPBRec pb;    OSErr error = noErr;    pb.dirInfo.ioNamePtr = f->name;    pb.dirInfo.ioVRefNum = f->vRefNum;    pb.dirInfo.ioDrDirID = f->parID;    pb.dirInfo.ioFDirIndex = 0;    error = PBGetCatInfoSync(&pb);    if (error == fnfErr && makeit)	return FSpDirCreate(f, smSystemScript, idp);    if (error != noErr) goto out;    if ((pb.dirInfo.ioFlAttrib & ioDirMask) == 0) {	error = dirNFErr;	goto out;    }    *idp = pb.dirInfo.ioDrDirID;  out:    return error;}/* Copy a resource into the current resource file */static OSErr copy_resource(ResType restype, short resid){    Handle h;    Str255 resname;    h = GetResource(restype, resid);    if (h != NULL) {	GetResInfo(h, &resid, &restype, resname);	DetachResource(h);	AddResource(h, restype, resid, resname);	if (ResError() == noErr)	    WriteResource(h);    }    return ResError();}struct write_settings {    int fd;    FSSpec tmpfile;    FSSpec dstfile;};void *open_settings_w(char const *sessionname, char **errmsg) {    short sessVRefNum;    long sessDirID;    OSErr error;    Str255 psessionname;    FSSpec dstfile;    *errmsg = NULL;    error = get_session_dir(kCreateFolder, &sessVRefNum, &sessDirID);    if (error != noErr) return NULL;    if (!sessionname || !*sessionname)	sessionname = "Default Settings";    c2pstrcpy(psessionname, sessionname);    error = FSMakeFSSpec(sessVRefNum, sessDirID, psessionname, &dstfile);    if (error == fnfErr) {	FSpCreateResFile(&dstfile, PUTTY_CREATOR, SESS_TYPE, smSystemScript);	if ((error = ResError()) != noErr) return NULL;    } else if (error != noErr) return NULL;    return open_settings_w_fsp(&dstfile);}/* * NB: Destination file must exist. */void *open_settings_w_fsp(FSSpec *dstfile){    short tmpVRefNum;    long tmpDirID;    struct write_settings *ws;    OSErr error;    Str255 tmpname;    ws = snew(struct write_settings);    ws->dstfile = *dstfile;    /* Create a temporary file to save to first. */    error = FindFolder(ws->dstfile.vRefNum, kTemporaryFolderType,		       kCreateFolder, &tmpVRefNum, &tmpDirID);    if (error != noErr) goto out;    c2pstrcpy(tmpname, tmpnam(NULL));    error = FSMakeFSSpec(tmpVRefNum, tmpDirID, tmpname, &ws->tmpfile);    if (error != noErr && error != fnfErr) goto out;    if (error == noErr) {	error = FSpDelete(&ws->tmpfile);	if (error != noErr) goto out;    }    FSpCreateResFile(&ws->tmpfile, PUTTY_CREATOR, SESS_TYPE, smSystemScript);    if ((error = ResError()) != noErr) goto out;    ws->fd = FSpOpenResFile(&ws->tmpfile, fsWrPerm);    if (ws->fd == -1) {error = ResError(); goto out;}    /* Set up standard resources.  Doesn't matter if these fail. */    copy_resource('STR ', -16396);    copy_resource('TMPL', TMPL_Int);    return ws;  out:    safefree(ws);    fatalbox("Failed to open session for write (%d)", error);}void write_setting_s(void *handle, char const *key, char const *value) {    int fd = *(int *)handle;    Handle h;    int id;    OSErr error;    Str255 pkey;    UseResFile(fd);    if (ResError() != noErr)        fatalbox("Failed to open saved session (%d)", ResError());    error = PtrToHand(value, &h, strlen(value));    if (error != noErr)	fatalbox("Failed to allocate memory");    /* Put the data in a resource. */    id = Unique1ID(FOUR_CHAR_CODE('TEXT'));    if (ResError() != noErr)	fatalbox("Failed to get ID for resource %s (%d)", key, ResError());    c2pstrcpy(pkey, key);    AddResource(h, FOUR_CHAR_CODE('TEXT'), id, pkey);    if (ResError() != noErr)	fatalbox("Failed to add resource %s (%d)", key, ResError());}void write_setting_i(void *handle, char const *key, int value) {    int fd = *(int *)handle;    Handle h;    int id;    OSErr error;    Str255 pkey;    UseResFile(fd);    if (ResError() != noErr)        fatalbox("Failed to open saved session (%d)", ResError());    /* XXX assume all systems have the same "int" format */    error = PtrToHand(&value, &h, sizeof(int));    if (error != noErr)	fatalbox("Failed to allocate memory (%d)", error);    /* Put the data in a resource. */    id = Unique1ID(FOUR_CHAR_CODE('Int '));    if (ResError() != noErr)	fatalbox("Failed to get ID for resource %s (%d)", key, ResError());    c2pstrcpy(pkey, key);    AddResource(h, FOUR_CHAR_CODE('Int '), id, pkey);    if (ResError() != noErr)	fatalbox("Failed to add resource %s (%d)", key, ResError());}void close_settings_w(void *handle) {    struct write_settings *ws = handle;    OSErr error;    CloseResFile(ws->fd);    if ((error = ResError()) != noErr)	goto out;    error = FSpExchangeFiles(&ws->tmpfile, &ws->dstfile);    if (error != noErr) goto out;    error = FSpDelete(&ws->tmpfile);    if (error != noErr) goto out;    return;  out:    fatalbox("Close of saved session failed (%d)", error);    safefree(handle);}void *open_settings_r(char const *sessionname){    short sessVRefNum;    long sessDirID;    FSSpec sessfile;    OSErr error;    Str255 psessionname;    error = get_session_dir(kDontCreateFolder, &sessVRefNum, &sessDirID);    if (!sessionname || !*sessionname)	sessionname = "Default Settings";    c2pstrcpy(psessionname, sessionname);    error = FSMakeFSSpec(sessVRefNum, sessDirID, psessionname, &sessfile);    if (error != noErr) goto out;    return open_settings_r_fsp(&sessfile);  out:    return NULL;}void *open_settings_r_fsp(FSSpec *sessfile){    OSErr error;    int fd;    int *handle;    fd = FSpOpenResFile(sessfile, fsRdPerm);    if (fd == 0) {error = ResError(); goto out;}    handle = snew(int);    *handle = fd;    return handle;  out:    return NULL;}char *read_setting_s(void *handle, char const *key, char *buffer, int buflen) {    int fd;    Handle h;    size_t len;    Str255 pkey;    if (handle == NULL) goto out;    fd = *(int *)handle;    UseResFile(fd);    if (ResError() != noErr) goto out;    c2pstrcpy(pkey, key);    h = Get1NamedResource(FOUR_CHAR_CODE('TEXT'), pkey);    if (h == NULL) goto out;    len = GetHandleSize(h);    if (len + 1 > buflen) goto out;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -