/*++ Copyright (c) 1994 Microsoft Corporation Module Name: gfrapiw.cxx Abstract: UNICODE versions of Windows Internet Extensions (WINX) Gopher Protocol APIs (in gfrapia.c) Contents: GopherCreateLocatorW GopherGetLocatorType GopherFindFirstFileW GopherFindNextW GopherOpenFileW GopherGetAttributeW GopherSendDataW Author: Richard L Firth (rfirth) 31-Oct-1994 Environment: Win32 user-level DLL Revision History: 31-Oct-1994 rfirth Created --*/ #include #include "gfrapih.h" // // functions // INTERNETAPI_(BOOL) GopherCreateLocatorW( IN LPCWSTR lpszHost, IN INTERNET_PORT nServerPort, IN LPCWSTR lpszDisplayString OPTIONAL, IN LPCWSTR lpszSelectorString OPTIONAL, IN DWORD dwGopherType, OUT LPWSTR lpszLocator, IN OUT LPDWORD lpdwBufferLength ) { DEBUG_ENTER_API((DBG_API, Bool, "GopherCreateLocatorW", "%wq, %d, %wq, %wq, %#x, %#x, %#x [%d]", lpszHost, nServerPort, lpszDisplayString, lpszSelectorString, dwGopherType, lpszLocator, lpdwBufferLength, lpdwBufferLength ? *lpdwBufferLength : 0 )); DWORD dwErr = ERROR_SUCCESS; MEMORYPACKET mpLocator,mpDisplay,mpSelector,mpHost; BOOL fResult = FALSE; if (!lpszHost || !lpdwBufferLength || (IsBadStringPtrW(lpszHost, INTERNET_MAX_PATH_LENGTH + 1)) || (IsBadWritePtr(lpdwBufferLength, sizeof(*lpdwBufferLength)))) { dwErr = ERROR_INVALID_PARAMETER; goto cleanup; } ALLOC_MB(lpszHost,0,mpHost); if (!mpHost.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszHost,mpHost); if (lpszDisplayString) { ALLOC_MB(lpszDisplayString,0,mpDisplay); if (!mpDisplay.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszDisplayString,mpDisplay); } if (lpszSelectorString) { ALLOC_MB(lpszSelectorString,0,mpSelector); if (!mpSelector.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszSelectorString,mpSelector); } mpLocator.dwSize = *lpdwBufferLength; if (lpszLocator) { mpLocator.dwAlloc = *lpdwBufferLength*sizeof(CHAR); mpLocator.psStr = (LPSTR)ALLOC_BYTES(mpLocator.dwAlloc); if (!mpLocator.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } } fResult = GopherCreateLocatorA(mpHost.psStr,nServerPort,mpDisplay.psStr,mpSelector.psStr, dwGopherType,mpLocator.psStr,&mpLocator.dwSize); *lpdwBufferLength = mpLocator.dwSize*sizeof(WCHAR); if (fResult && (*lpdwBufferLength <= mpLocator.dwAlloc)) { *lpdwBufferLength = (MultiByteToWideChar(CP_ACP, 0, mpLocator.psStr, -1, lpszLocator, mpLocator.dwAlloc/sizeof(WCHAR))+1)*sizeof(WCHAR); } cleanup: if (dwErr!=ERROR_SUCCESS) { SetLastError(dwErr); DEBUG_ERROR(API, dwErr); } DEBUG_LEAVE_API(fResult); return fResult; } INTERNETAPI_(BOOL) GopherGetLocatorTypeW( IN LPCWSTR lpszLocator, OUT LPDWORD lpdwGopherType ) { DEBUG_ENTER_API((DBG_API, Bool, "GopherGetLocatorTypeW", "%wq, %#x", lpszLocator, lpdwGopherType )); DWORD dwErr = ERROR_SUCCESS; BOOL fResult = FALSE; MEMORYPACKET mpLocator; if (!lpszLocator) { dwErr = ERROR_INVALID_PARAMETER; goto cleanup; } ALLOC_MB(lpszLocator,0,mpLocator); if (!mpLocator.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszLocator,mpLocator); fResult = GopherGetLocatorTypeA(mpLocator.psStr,lpdwGopherType); cleanup: if (dwErr!=ERROR_SUCCESS) { SetLastError(dwErr); DEBUG_ERROR(API, dwErr); } DEBUG_LEAVE_API(fResult); return fResult; } BOOL TransformGopherFindDataToW(LPGOPHER_FIND_DATAA pgfdA, LPGOPHER_FIND_DATAW pgfdW) { pgfdW->GopherType = pgfdA->GopherType; pgfdW->SizeLow = pgfdA->SizeLow; pgfdW->SizeHigh = pgfdA->SizeHigh; pgfdW->LastModificationTime = pgfdA->LastModificationTime; MultiByteToWideChar(CP_ACP, 0, pgfdA->DisplayString, -1, pgfdW->DisplayString, MAX_GOPHER_DISPLAY_TEXT + 1); MultiByteToWideChar(CP_ACP, 0, pgfdA->Locator, -1, pgfdW->Locator, MAX_GOPHER_LOCATOR_LENGTH + 1); return TRUE; } INTERNETAPI_(HINTERNET) GopherFindFirstFileW( IN HINTERNET hGopherSession, IN LPCWSTR lpszLocator OPTIONAL, IN LPCWSTR lpszSearchString OPTIONAL, OUT LPGOPHER_FIND_DATAW lpBuffer OPTIONAL, IN DWORD dwFlags, IN DWORD_PTR dwContext ) { DEBUG_ENTER_API((DBG_API, Handle, "GopherFindFirstFileW", "%#x, %wq, %wq, %#x, %#x, %$x", hGopherSession, lpszLocator, lpszSearchString, lpBuffer, dwFlags, dwContext )); DWORD dwErr = ERROR_SUCCESS; HINTERNET hInternet=NULL; MEMORYPACKET mpLocator, mpSearch; GOPHER_FIND_DATAA gfda; if (lpszLocator && (IsBadStringPtrW(lpszLocator, INTERNET_MAX_PATH_LENGTH + 1))) { dwErr = ERROR_GOPHER_INVALID_LOCATOR; goto cleanup; } if ((lpszSearchString && (IsBadStringPtrW(lpszSearchString, INTERNET_MAX_PATH_LENGTH + 1))) || (lpBuffer && (IsBadWritePtr(lpBuffer, sizeof(*lpBuffer))))) { dwErr = ERROR_INVALID_PARAMETER; goto cleanup; } if (lpszLocator) { ALLOC_MB(lpszLocator,0,mpLocator); if (!mpLocator.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszLocator,mpLocator); } if (lpszSearchString) { ALLOC_MB(lpszSearchString,0,mpSearch); if (!mpSearch.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszSearchString,mpSearch); } hInternet = GopherFindFirstFileA(hGopherSession, mpLocator.psStr, mpSearch.psStr, &gfda, dwFlags, dwContext); if (hInternet && lpBuffer) { TransformGopherFindDataToW(&gfda, lpBuffer); } cleanup: if (dwErr!=ERROR_SUCCESS) { SetLastError(dwErr); DEBUG_ERROR(API, dwErr); } DEBUG_LEAVE_API(hInternet); return hInternet; } BOOL GopherFindNextW( IN HINTERNET hFind, OUT LPGOPHER_FIND_DATA lpBuffer ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } INTERNETAPI_(HINTERNET) GopherOpenFileW( IN HINTERNET hGopherSession, IN LPCWSTR lpszLocator, IN LPCWSTR lpszView OPTIONAL, IN DWORD dwFlags, IN DWORD_PTR dwContext ) { DEBUG_ENTER_API((DBG_API, Handle, "GopherOpenFileW", "%#x, %wq, %wq, %#x, %#x", hGopherSession, lpszLocator, lpszView, dwFlags, dwContext )); DWORD dwErr = ERROR_SUCCESS; HINTERNET hInternet = NULL; MEMORYPACKET mpLocator,mpView; if (!lpszLocator) { dwErr = ERROR_INVALID_PARAMETER; goto cleanup; } ALLOC_MB(lpszLocator,0,mpLocator); if (!mpLocator.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszLocator,mpLocator); if (lpszView) { ALLOC_MB(lpszView,0,mpView); if (!mpView.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszView,mpView); } hInternet = GopherOpenFileA(hGopherSession,mpLocator.psStr,mpView.psStr,dwFlags,dwContext); cleanup: if (dwErr!=ERROR_SUCCESS) { SetLastError(dwErr); DEBUG_ERROR(API, dwErr); } DEBUG_LEAVE_API(hInternet); return hInternet; } INTERNETAPI_(BOOL) GopherGetAttributeW( IN HINTERNET hGopherSession, IN LPCWSTR lpszLocator, IN LPCWSTR lpszAttributeName OPTIONAL, OUT LPBYTE lpBuffer, IN DWORD dwBufferLength, OUT LPDWORD lpdwCharactersReturned, IN GOPHER_ATTRIBUTE_ENUMERATOR lpfnEnumerator OPTIONAL, IN DWORD_PTR dwContext ) { #if !defined(GOPHER_ATTRIBUTE_SUPPORT) SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; #else DEBUG_ENTER_API((DBG_API, Bool, "GopherGetAttributeW", "%#x, %wq, %wq, %#x, %d, %#x, %#x, %#x", hGopherSession, lpszLocator, lpszAttributeName, lpBuffer, dwBufferLength, lpdwCharactersReturned, lpfnEnumerator, dwContext )); // WARNING: This function may not function after all; You've been warned. DWORD dwErr = ERROR_SUCCESS; BOOL fResult = FALSE; MEMORYPACKET mpLocator,mpAttribute; ALLOC_MB(lpszLocator,0,mpLocator); if (!mpLocator.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszLocator,mpLocator); if (lpszAttributeName) { ALLOC_MB(lpszAttributeName,0,mpAttribute); if (!mpAttribute.psStr) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } UNICODE_TO_ANSI(lpszAttributeName,mpAttribute); } fResult = GopherGetAttributeA(hGopherSession,mpLocator.psStr,mpAttribute.psStr, lpBuffer,dwBufferLength,lpdwCharactersReturned, lpfnEnumerator, dwContext); cleanup: if (dwErr!=ERROR_SUCCESS) { DEBUG_ERROR(API, dwErr); SetLastError(dwErr); } DEBUG_LEAVE_API(fResult); return fResult; #endif // defined(GOPHER_ATTRIBUTE_SUPPORT) } // //INTERNETAPI_(BOOL) GopherSendDataW( // IN HINTERNET hGopherSession, // IN LPCWSTR lpszLocator, // IN LPCWSTR lpszBuffer, // IN DWORD dwNumberOfCharactersToSend, // OUT LPDWORD lpdwNumberOfCharactersSent, // IN DWORD dwContext // ) //{ //#if 1 // SetLastError(ERROR_CALL_NOT_IMPLEMENTED); // return FALSE; //#else // DWORD dwErr; // MEMORYPACKET mpLocator,mpView; // // MAKE_ANSI(lpszLocator,0,mpLocator); // if (lpszView) // { // MAKE_ANSI(lpszView,0,mpView); // } // return GopherSendDataA(hGopherSession,mpLocator.psStr,mpView.psStr,dwFlags); // // LEAVE_API_CALL(FALSE); //#endif //}