📄 memotransfer.c
字号:
if (eolP)
{
len = outputFunc( outputStream, c, eolP - c);
outputFunc(outputStream, crlf, stringZLen);
c = eolP + sizeOf7BitChar(linefeedChr);
}
else if (*c != '\0')
{
eolP = StrChr(c, '\0');
len = outputFunc( outputStream, c, eolP - c);
c = eolP;
}
}
outputFunc(outputStream, crlf, stringZLen); // always end with an extra crlf
}
/***********************************************************************
*
* FUNCTION: MemoTransferPreview
*
* DESCRIPTION: Create a short string preview of the data coming in.
*
* PARAMETERS: infoP - the preview info from the command parameter block
* of the sysAppLaunchCmdExgPreview launch
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* ABa 11/10/00 Created
*
***********************************************************************/
void MemoTransferPreview(ExgPreviewInfoType *infoP)
{
volatile Err err;
UInt16 numRecordsReceived;
StreamType stream;
if (infoP->op == exgPreviewQuery)
{
infoP->types = exgPreviewShortString;
return;
}
if (infoP->op != exgPreviewShortString)
{
infoP->error = exgErrNotSupported;
return;
}
// if we have a description we don't have to parse the vObject
if (infoP->socketP->description && *infoP->socketP->description)
{
StrNCopy(infoP->string, infoP->socketP->description, infoP->size - 1);
infoP->string[infoP->size - 1] = 0;
infoP->error = errNone;
return;
}
PrvStreamInit(&stream, infoP->socketP);
err = ExgAccept(infoP->socketP);
if (!err)
{
ErrTry
{
MemoImportMime((DmOpenRef) NULL, &stream, PrvReadFunction, false, false, &numRecordsReceived, infoP->string, infoP->size);
}
ErrCatch(inErr)
{
err = inErr;
} ErrEndCatch
ExgDisconnect(infoP->socketP, err); // closes transfer dialog
}
infoP->error = err;
}
#pragma mark -
/***********************************************************************
*
* FUNCTION: PrvStreamInit
*
* DESCRIPTION: Function to put Initialize a stream socket.
*
* PARAMETERS: streamP - the output stream
* exgSocketP - pointer to an intitialized exgSocket
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* gavin 10/5/99 Initial revision
*
***********************************************************************/
static void PrvStreamInit(StreamType *streamP, ExgSocketPtr exgSocketP)
{
streamP->socket = exgSocketP;
streamP->bufSize = maxStreamBuf;
streamP->pos = 0;
streamP->len = 0;
}
/***********************************************************************
*
* FUNCTION: PrvStreamFlush
*
* DESCRIPTION: Function to put a string to the exg transport.
*
* PARAMETERS: streamP - the output stream
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* gavin 10/5/99 Initial revision
*
***********************************************************************/
static void PrvStreamFlush(StreamType *streamP)
{
Err err = 0;
while (streamP->len && !err)
streamP->len -= ExgSend(streamP->socket,streamP->buf,streamP->len,&err);
}
/***********************************************************************
*
* FUNCTION: PrvStreamWrite
*
* DESCRIPTION: Function to put a string to the exg transport.
*
* PARAMETERS: streamP - the output stream
* stringP - the string to put
*
* RETURNED: nothing
* If the all the string isn't sent an error is thrown using ErrThrow.
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* gavin 10/5/99 Initial revision
*
***********************************************************************/
static UInt32 PrvStreamWrite(StreamType *streamP, const Char * stringP, Int32 length, Err *errP)
{
UInt32 count = 0;
*errP = 0;
while (count < length && !*errP)
{
if (streamP->len < streamP->bufSize)
{
streamP->buf[streamP->len++] = *stringP++;
count++;
}
else
streamP->len -= ExgSend(streamP->socket, streamP->buf, streamP->len, errP);
}
return count;
}
/***********************************************************************
*
* FUNCTION: PrvStreamRead
*
* DESCRIPTION: Function to get a character from the input stream.
*
* PARAMETERS: streamP - the output stream
*
* RETURNED: a character of EOF if no more data
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* gavin 10/5/99 Initial revision
*
***********************************************************************/
static UInt32 PrvStreamRead(StreamType * streamP, Char *bufP, UInt32 length, Err *errP)
{
UInt32 count = 0;
*errP = 0;
while (count < length)
{
if (streamP->pos < streamP->len)
bufP[count++] = streamP->buf[streamP->pos++];
else
{ streamP->pos = 0;
streamP->len = ExgReceive(streamP->socket, streamP->buf, streamP->bufSize, errP);
if (!streamP->len || *errP)
break;
}
}
return count;
}
/***********************************************************************
*
* FUNCTION: PrvStreamSocket
*
* DESCRIPTION: returns the socket from a stream.
*
* PARAMETERS: streamP - the output stream
*
* RETURNED: The socket associated with the stream
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* gavin 10/5/99 Initial revision
*
***********************************************************************/
static ExgSocketPtr PrvStreamSocket(StreamType *streamP)
{
return streamP->socket;
}
/***********************************************************************
*
* FUNCTION: GetChar
*
* DESCRIPTION: Function to get a character from the exg transport.
*
* PARAMETERS: exgSocketP - the exg connection
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* roger 8/15/97 Initial Revision
*
***********************************************************************/
static UInt32 PrvReadFunction(const void * stream, Char * bufferP, UInt32 length)
{
Err err;
UInt32 bytesRead;
bytesRead = PrvStreamRead((StreamType *)stream, bufferP, length, &err);
if (err)
ErrThrow(err);
return bytesRead;
}
/***********************************************************************
*
* FUNCTION: PutString
*
* DESCRIPTION: Function to put a string to the exg transport.
*
* PARAMETERS: exgSocketP - the exg connection
* stringP - the string to put
*
* RETURNED: nothing
* If the all the string isn't sent an error is thrown using ErrThrow.
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* roger 8/15/97 Initial Revision
*
***********************************************************************/
static UInt32 PrvWriteFunction(void * stream, const Char * const bufferP, Int32 length)
{
UInt32 len;
Err err;
// passing -1 length will assume a null terminated string
if (length == -1) length = StrLen(bufferP);
len = PrvStreamWrite( stream, bufferP, length, &err);
// If the bytes were not sent throw an error.
if ((len == 0 && length > 0) || err)
ErrThrow(err);
return len;
}
/***********************************************************************
*
* FUNCTION: PrvTransferCleanFileName
*
* DESCRIPTION: Remove dot characters in file name but not the least
* PARAMETERS: a pointer to a string
*
* RETURNED: String parameter doesn't contains superfluous dot characters
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* ABa 7/28/00 Created
*
***********************************************************************/
static void PrvTransferCleanFileName(Char* ioFileName)
{
Char* mayBeLastDotP;
Char* lastDotP;
UInt32 chrFullStopSize = TxtCharSize(chrFullStop);
// prevent NULL & empty string
if (ioFileName == NULL || *ioFileName == 0)
return;
// remove dot but not the last one
mayBeLastDotP = StrChr(ioFileName, chrFullStop);
while ((lastDotP = StrChr(mayBeLastDotP + chrFullStopSize, chrFullStop)))
{
// remove the dot
StrCopy(mayBeLastDotP, mayBeLastDotP + chrFullStopSize);
mayBeLastDotP = lastDotP - chrFullStopSize;
}
}
/***********************************************************************
*
* FUNCTION: PrvSetDescriptionAndFilename
*
* DESCRIPTION: Derive and allocate a decription and filename from some text.
* The filename will be a URL which includes the specified scheme.
*
* PARAMETERS: textP - the text string to derive the names from
* descriptionPP - pointer to set to the allocated description
* descriptionHP - MemHandle to set to the allocated description
* filenamePP - pointer to set to the allocated filename
* filenameHP - MemHandle to set to the allocated description
* prefix - the scheme with ":" suffix and optional "?" prefix
*
* RETURNED: a description and filename are allocated and the pointers are set
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* roger 11/4/97 Initial Revision
*
***********************************************************************/
static void PrvSetDescriptionAndFilename(Char * textP, Char **descriptionPP,
MemHandle *descriptionHP, Char **filenamePP, MemHandle *filenameHP, const Char * const prefix)
{
Char * descriptionP;
Int16 descriptionSize;
Coord descriptionWidth;
Boolean descriptionFit;
Char * spaceP;
Char * filenameP;
MemHandle resourceH;
Char * resourceP;
UInt8 filenameLength;
UInt8 schemeLength;
Coord unused;
descriptionSize = StrLen(textP);
WinGetDisplayExtent(&descriptionWidth, &unused);
FntCharsInWidth (textP, &descriptionWidth, &descriptionSize, &descriptionFit);
if (descriptionSize > 0)
{
*descriptionHP = MemHandleNew(descriptionSize+sizeOf7BitChar('\0'));
if (*descriptionHP)
{
descriptionP = MemHandleLock(*descriptionHP);
MemMove(descriptionP, textP, descriptionSize);
descriptionP[descriptionSize] = nullChr;
}
}
else
{
*descriptionHP = DmGetResource(strRsc, BeamDescriptionStr);
descriptionP = MemHandleLock(*descriptionHP);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -