Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

478 lines
11 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: xfer.h
//
//--------------------------------------------------------------------------
#ifndef _XFER_H_
#define _XFER_H_
#include <stdio.h>
#define SERVICE_NAME_1 "OBEX:IrXfer"
#define SERVICE_NAME_2 "OBEX"
#define GUARD_MAGIC 0x45454545
#define TIMEOUT_INFINITE (~0UL)
#define ERROR_DESCRIPTION_LENGTH 1000
#define IRDA_DEVICE_NAME_LENGTH 22
//
// OBEX parameter codes
//
#define OBEX_PARAM_UNICODE 0x00
#define OBEX_PARAM_STREAM 0x40
#define OBEX_PARAM_1BYTE 0x80
#define OBEX_PARAM_4BYTE 0xC0
#define OBEX_PARAM_TYPE_MASK 0xC0
#define OBEX_PARAM_COUNT ( 0x00 | OBEX_PARAM_4BYTE )
#define OBEX_PARAM_NAME ( 0x01 | OBEX_PARAM_UNICODE )
#define OBEX_PARAM_LENGTH ( 0x03 | OBEX_PARAM_4BYTE )
#define OBEX_PARAM_UNIX_TIME ( 0x04 | OBEX_PARAM_4BYTE )
#define OBEX_PARAM_ISO_TIME ( 0x04 | OBEX_PARAM_STREAM )
#define OBEX_PARAM_BODY ( 0x08 | OBEX_PARAM_STREAM )
#define OBEX_PARAM_BODY_END ( 0x09 | OBEX_PARAM_STREAM )
#define OBEX_PARAM_WHO ( 0x0A | OBEX_PARAM_STREAM )
// #define OBEX_PARAM_LEN 1
#define PRIVATE_PARAM_WIN32_ERROR ( 0x30 | OBEX_PARAM_4BYTE )
// for xfer.c
typedef struct {
BOOL fXferInProgress; // transfer in progress
__int64 dwTotalSize; // total size of transfer
__int64 dwTotalSent; // number of bytes sent in this transfer
__int64 dwFileSize; // total size of current file
__int64 dwFileSent; // number of bytes sent of the current file
} DATA_XFER, *LPDATA_XFER;
typedef struct {
FILETIME filetime; // file time
WCHAR szFileName[MAX_PATH]; // name of file
WCHAR szFileSave[MAX_PATH]; // path+name of final file
WCHAR szFileTemp[MAX_PATH]; // path+name of temp file used
HANDLE hFile; // file handle (of szFileTemp)
} DATA_FILE, *LPDATA_FILE;
// for obex.c
typedef struct {
BYTE1 b1Flags; // setpath flags
BYTE1 b1Constants; // setpath constants
} DATA_PATH, *LPDATA_PATH;
typedef struct {
BOOL fWaiting; // indicates if waiting for a reply
BYTE1 b1Status; // response status (error/success)
} DATA_REPLY, *LPDATA_REPLY;
typedef enum {
osIDLE = 0,
osCONN = 1,
osFILE = 2
} OBEXSTATE;
typedef struct {
LPSTORE lpStore;
OBEXSTATE state;
BYTE1 b1Version; // peer's version of obex
BYTE1 b1Flags; // connection flags
BYTE2 b2MaxPacket; // peer's maximum packet size
} DATA_CONN, *LPDATA_CONN;
// for status.c
typedef struct {
DWORD dwDeviceID;
BOOL fClear;
} TARGET_ITEM, *LPTARGET_ITEM;
//-------------------------------------
enum TRANSFER_STATE
{
BLANK,
CONNECTING,
ACCEPTING,
READING,
WRITING,
CLOSING
};
enum OBEX_DIALECT
{
dialUnknown = 0,
dialWin95,
dialNt5
};
typedef class FILE_TRANSFER * PFILE_TRANSFER;
class FILE_TRANSFER
{
public:
FILE_TRANSFER( );
~FILE_TRANSFER();
BOOL
Xfer_Init(
wchar_t * files,
unsigned length,
OBEX_DIALECT dialect ,
OBEX_DEVICE_TYPE DeviceType,
BOOL CreateSocket,
SOCKET ListenSocket
);
BOOL
SendReplyObex(
BYTE1 ObexCode
);
BOOL
SendReplyWin32(
BYTE1 b1Opcode,
DWORD status
);
void
BeginSend(
DWORD DeviceId,
OBEX_DEVICE_TYPE DeviceType,
error_status_t * pStatus,
FAILURE_LOCATION * pLocation
);
void Deactivate();
DWORD
SyncAccept(
VOID
);
handle_t _rpcHandle;
COOKIE _cookie;
MUTEX * _mutex;
inline long
DecrementRefCount()
{
EnterCriticalSection(&m_Lock);
long count = --_refs;
DbgLog3(SEV_INFO, "[%x] %p: refs = %d\n", (DWORD) _cookie, this, count);
if (0 == count) {
#if DBG
DbgPrint("irmon: freeing transfer\n");
#endif
LeaveCriticalSection(&m_Lock);
delete this;
return count;
} else {
LeaveCriticalSection(&m_Lock);
}
return count;
}
inline BOOL
IsActive(
VOID
)
{
return (_state != ACCEPTING);
}
inline long
IncrementRefCount()
{
EnterCriticalSection(&m_Lock);
long count = ++_refs;
DbgLog3(SEV_INFO, "[%x] %p: refs = %d\n", (DWORD) _cookie, this, count);
LeaveCriticalSection(&m_Lock);
return count;
}
void Cancel()
{
_fCancelled = TRUE;
}
COOKIE
GetCookie(
VOID
)
{
return _cookie;
}
void Send();
void RecordDeviceName( SOCKADDR_IRDA * s );
VOID
StopListening(
VOID
)
{
IncrementRefCount();
EnterCriticalSection(&m_Lock);
m_StopListening=TRUE;
if (m_ListenSocket != INVALID_SOCKET) {
closesocket(m_ListenSocket);
m_ListenSocket=INVALID_SOCKET;
}
LeaveCriticalSection(&m_Lock);
DecrementRefCount();
return;
}
void
RecordIpDeviceName(
sockaddr_in * Address
);
private:
CRITICAL_SECTION m_Lock;
BOOL m_StopListening;
SOCKET m_ListenSocket;
OBEX_DEVICE_TYPE m_DeviceType;
BOOL _fCancelled;
BOOL _fInUiReceiveList;
XFER_TYPE _xferType;
TRANSFER_STATE _state;
SOCKET _socket;
wchar_t * _files;
long _refs;
WSABUF _buffers;
HANDLE _event;
BOOL _fWriteable;
OBEX_DIALECT _dialect;
wchar_t _DeviceName[MAX_PATH];
WSAOVERLAPPED _overlapped;
HANDLE _waitHandle;
BYTE _buffer[ cbSOCK_BUFFER_SIZE + 16 + sizeof(SOCKADDR_IRDA) + 16 + sizeof(SOCKADDR_IRDA) ];
DWORD _guard;
void
HandleClosure(
DWORD error
);
// for sock.c
error_status_t Sock_Request( LPVOID lpvData, DWORD dwDataSize );
error_status_t Sock_Respond( LPVOID lpvData, DWORD dwDataSize );
error_status_t Sock_EstablishConnection( DWORD dwDeviceID ,OBEX_DEVICE_TYPE DeviceType);
VOID Sock_BreakConnection( SOCKET * pSock );
error_status_t _SendDataOnSocket( SOCKET sock, LPVOID lpvData, DWORD dwDataSize );
VOID _BreakConnection( SOCKET sock );
VOID _ReadConnection( SOCKET sock );
error_status_t Sock_CheckForReply( long Timeout );
// for xfer.c
UINT _uObjsReceived;
WCHAR _szRecvFolder[MAX_PATH];
DATA_FILE _dataFileRecv;
DATA_XFER _dataXferRecv;
BOOL Xfer_FileSetSize( BYTE4 b4Size );
error_status_t Xfer_FileWriteBody( LPVOID lpvData, BYTE2 b2Size, BOOL fFinal );
VOID Xfer_ConnEnd( VOID );
error_status_t Xfer_ConnStart( VOID );
VOID Xfer_FileAbort( VOID );
VOID Xfer_FileInit( VOID );
error_status_t Xfer_FileSetName( LPWSTR szName );
VOID Xfer_FileSetTime( FILETIME * FileTime );
error_status_t Xfer_SetPath( LPWSTR szPath );
VOID Xfer_SetSize( BYTE4 b4Size );
error_status_t _PutFileBody( HANDLE hFile, wchar_t FileName[] );
error_status_t _SendFile( LPWSTR szFile );
error_status_t _SendFolder( LPWSTR szFolder );
error_status_t _FileStart( VOID );
error_status_t _FileEnd( BOOL fSave );
VOID _Send_StartXfer( __int64 dwTotalSize, LPWSTR szDst );
VOID _Send_EndXfer( VOID );
error_status_t _SetReceiveFolder( LPWSTR szFolder );
// for progress.c
DWORD _dwTimeStart;
DWORD _dwSecondsLeft;
int _CurrentPercentage;
VOID _FormatTime( LPWSTR sz, DWORD dwSeconds );
// for obex.c
DATA_CONN _dataRecv;
DATA_PATH _dataPath;
DATA_REPLY _dataReply;
ULONG _blocksSent;
ULONG _blocksAcked;
ULONG _blockSize;
__int64 _completedFilesSize;
__int64 _currentFileSize;
__int64 _currentFileAcked;
DWORD _lastAckTime;
error_status_t Obex_Abort( error_status_t status );
error_status_t Obex_Connect( __int64 dwTotalSize );
error_status_t Obex_Disconnect( error_status_t status );
error_status_t Obex_PutBegin( LPWSTR wszObj, __int64 dwObjSize, FILETIME * pFileTime );
error_status_t Obex_PutBody( wchar_t FileName[], LPBYTE1 pb1Data, BYTE2 b2DataSize, BOOL fFinal );
error_status_t Obex_SetPath( LPWSTR wszPath );
BOOL Obex_ConsumePackets( XFER_TYPE xferType, error_status_t * pStatus );
BOOL Obex_Init( VOID );
BOOL Obex_ReceiveData( XFER_TYPE xferType, LPVOID lpvData, DWORD dwDataSize );
VOID Obex_Reset( VOID );
error_status_t _WaitForReply( DWORD dwTimeout, BYTE1 b1NeededReply );
error_status_t _Put( LPWSTR wszObj, __int64 dwObjSize, FILETIME * Time, LPBYTE1 pb1Data, BYTE2 b2DataSize, BOOL fFinal );
error_status_t _Request( LPSTORE lpStore, BYTE1 b1NeededReply );
error_status_t _Respond( LPSTORE lpStore );
INT _ValidOpcode( OBEXSTATE state, BYTE1 b1Opcode );
BOOL _HandleAbort( BYTE1 b1Opcode, BYTE2 b2Length );
BOOL _HandleBadRequest( BYTE1 b1Opcode );
BOOL _HandleConnect( BYTE1 b1Opcode, BYTE2 b2Length );
BOOL _HandleDisconnect( BYTE1 b1Opcode, BYTE2 b2Length );
BOOL _HandleNotImplemented( BYTE1 b1Opcode );
error_status_t _HandlePut( BYTE1 b1Opcode, BYTE2 b2Length, BOOL fFinal );
error_status_t _HandleResponse( BYTE1 b1Status, BYTE2 b2Length );
error_status_t _HandleRequest( BYTE1 b1Opcode, BYTE2 b2Length );
error_status_t _HandleSetPath( BYTE1 b1Opcode, BYTE2 b2Length );
error_status_t _ParseParams( BYTE1 b1Opcode, BYTE2 b2Length );
BOOL _PokePacketSizeIntoStore( LPSTORE lpStore );
VOID _SetState( LPDATA_CONN lpDataConn, OBEXSTATE os );
VOID _WaitInit( VOID );
VOID _WriteBody( LPVOID lpvData, BYTE2 b2Size, BOOL fFinal );
BYTE2 _SkipHeader( BYTE1 b1Param, LPSTORE lpStore );
BYTE1
StatusToReplyCode(
BYTE1 b1Opcode,
DWORD status
);
error_status_t
ObexStatusToWin32(
BYTE1 ObexStatus
);
BOOL Activate();
};
error_status_t
_GetObjListStats(
LPWSTR lpszObjList,
LPDWORD lpdwFiles,
LPDWORD lpdwFolders,
__int64 * pTotalSize
);
DWORD
ReportFileError( DWORD mc,
WCHAR * file,
DWORD error
);
BYTE1 WinErrorToObexError( DWORD Win32Error );
BOOL IsWorkstationLocked();
extern RPC_BINDING_HANDLE rpcBinding;
extern BOOL g_fAllowReceives;
extern wchar_t g_DuplicateFileTemplate[];
extern wchar_t g_UnknownDeviceName[];
extern MUTEX * g_Mutex;
#include <stdio.h>
extern "C" {
FILE_TRANSFER* InitializeSocket(
char ServiceName[]
);
FILE_TRANSFER *
ListenForTransfer(
SOCKET ListenSocket,
OBEX_DEVICE_TYPE DeviceType
);
}
FILE_TRANSFER*
InitializeSocket(
char ServiceName[]
);
#endif // _XFER_H_