//----------------------------------------------------------------------
// Copyright (C) 1993-1997 Microsoft Corporation.
// All rights reserved.
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//WebPost API usage example
//
// This example allows the user to post files to a web site.
//
//----------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <tchar.h>
#include <wpapi.h>
#include <wpspi.h>
#include "wbpost.h"
//global buffer for holding the error message
TCHARg_rgchErr[MAX_PATH];
//you can always call WpGetErrorString to get the full error string text.
VOID
GetErrorString(LONG lErr)
{
DWORDdwErr;
LONGlRet;
dwErr=MAX_PATH;
lRet=WpGetErrorString(
(UINT)lErr,//uErrCode
(LPTSTR)g_rgchErr,//sOutputBuf
&dwErr);//pdwBufLen
if(FAILED(lRet))
g_rgchErr[0]=NULL;
return;
}
LONG
SimpleWebPost( LPTSTR lpszFileName )
{
LONG lRet;
_tprintf("Calling WpPost(...,%s,...)\n", lpszFileName);
lRet = WpPost(NULL,// hWin
1,// count of files
&lpszFileName,// file list
NULL,// lpcbSiteName
NULL,// lpszSiteName
NULL,// lpcbURL
NULL,// lpszURL
0 );// flags
GetErrorString(lRet);
_tprintf("WpPost returned 0x%x which means %s\n", lRet, g_rgchErr);
return lRet;
}
LONG
EnumProviders()
{
static TCHARbuffer[8192];
LPWPPROVINFOlpbProv;
DWORDcProv, cbProv, lRet, i;
cbProv=sizeof(buffer);
cProv=0;
lpbProv=(LPWPPROVINFO)buffer;
printf("Calling WpEnumProviders()\n");
lRet=WpEnumProviders(&cbProv,//pdwProvidersBufLen
lpbProv,//pProvidersBuffer
&cProv);//pdwNumProviders
GetErrorString(lRet);
_tprintf("WpEnumProviders() returned 0x%x which means %s\n", lRet, g_rgchErr);
if(lRet)
return lRet;
printf("Total Providers: %d\n", cProv);
for(i=0; i<cProv; i++, lpbProv++)
{
_tprintf("%d, Name =%s\n", i, lpbProv->lpszProviderName);
_tprintf(" CLSID=%s\n", lpbProv->lpszProviderCLSID);
_tprintf(" Path =%s\n", lpbProv->lpszDllPath);
}
return lRet;
}
LONG
ListSites()
{
static TCHARbuffer[8192];
LPWPSITEINFOlpbSites;
DWORDcSites, cbSites, lRet, i;
cbSites = sizeof( buffer );
cSites = 0;
lpbSites = (LPWPSITEINFO) buffer;
printf("Calling WpListSites()\n");
lRet = WpListSites( &cbSites, lpbSites, &cSites );
GetErrorString(lRet);
_tprintf("WpListSites() returned 0x%x which means %s\n", lRet, g_rgchErr);
if (lRet)
return lRet;
printf("Total Sites: %d\n", cSites);
for (i = 0; i < cSites; i++, lpbSites++)
_tprintf("%d. SiteName=%s\n", i, lpbSites->lpszSiteName);
return lRet;
}
//
// The next function illustrates getting a pointer to the web post
// provider's interface and calling the functions in that interface.
//
LONG
AdvancedWebPost( LPTSTR lpszSiteName, LPTSTR lpszFileName )
{
LONGcbURL = 0;
LONGlRet;
LONGlErrType;
LONGlErrBufLen;
WCHARrgwchFileName[MAX_PATH];
WCHARrgwchError[MAX_PATH];
LPWSTRlpwFileName;
IWPProvider*lpSite = NULL;
_tprintf("Calling WpBindToSite(..., %s, ...)\n", lpszSiteName);
lRet = WpBindToSite(NULL,// hWin
lpszSiteName,
NULL,// lpszURL
0,// fdwFlags
0,// dwReserved
(PVOID *)&lpSite );// Interface pointer
GetErrorString(lRet);
_tprintf("WpBindToSite returned 0x%x which means %s\n", lRet, g_rgchErr);
if (lRet)
return lRet;
//note that both the old IWPSite interface and the IWPProvider interface
//are unicode only.
lRet = lpSite->NetworkConnect(NULL, NULL);
printf("NetworkConnect returned 0x%x\n", HRESULT_CODE(lRet));
if (lRet)
goto cleanup;
lRet = lpSite->ServerLogin(NULL, NULL);
printf("ServerLogin returned 0x%x\n", HRESULT_CODE(lRet));
if (lRet)
goto cleanup;
_tprintf("Calling PostFiles(...,%s,..)\n", lpszFileName);
#ifdef _UNICODE
lpwFileName=lpszFileName;
#else
MultiByteToWideChar(CP_ACP, 0, lpszFileName, lstrlenA(lpszFileName), rgwchFileName, MAX_PATH);
lpwFileName=rgwchFileName;
#endif
lRet = lpSite->PostFiles(1,// cLocalPaths
&lpwFileName,//this has to be unicode
&cbURL,// lpcbURL
NULL,// lpszURL
0 );// fdwFlags
lErrType=0;
lErrBufLen=MAX_PATH;
lpSite->GetError(
&lErrType,//pdwErrorType
&lRet,//pdwErrorCode
&lErrBufLen,//pdwErrorBufLen
rgwchError);//wsError
wprintf(L"PostFiles returned 0x%x which means %s\n", HRESULT_CODE(lRet), rgwchError);
lRet = lpSite->ServerLogout();
printf("ServerLogout returned 0x%x\n", HRESULT_CODE(lRet));
if (lRet)
goto cleanup;
lRet = lpSite->NetworkDisconnect();
printf("NetworkDisconnect returned 0x%x\n", HRESULT_CODE(lRet));
cleanup:
lRet = lpSite->Release();
printf("Release returned 0x%x\n", HRESULT_CODE(lRet));
return lRet;
}
void
usage(void)
{
printf("Usage: wbpost [-s sitename] [filename]\n");
printf(" wbpost -l\t: lists the web sites\n");
printf(" wbpost -e\t: numerates the available providers\n");
exit(1);
}
int __cdecl
main(int argc, char *argv[])
{
LPTSTRlpszSiteName = NULL, lpszFileName = NULL;
intfList = 0;
intfEnum = 0;
LONGlRet;
charc;
#ifdef _UNICODE
WCHARrgwch[MAX_PATH];
#endif
// parse the arguments
while (--argc > 0 && (*++argv)[0] == '-')
if (c = *++argv[0])
switch (c) {
case 'l':
fList = 1;
break;
case 'e':
fEnum = 1;
break;
case 's':
if (--argc) {
#ifdef _UNICODE
MultiByteToWideChar(CP_ACP, 0, *++argv, lstrlenA(*argv), rgwch, MAX_PATH);
lpszSiteName=rgwch;
#else
lpszSiteName = *++argv;
#endif
}
break;
default:
printf("Error: illegal option %c\n", c);
usage();
break;
}
if (argc == 1) {
#ifdef _UNICODE
MultiByteToWideChar(CP_ACP, 0, *argv, lstrlenA(*argv), rgwch, MAX_PATH);
lpszFileName=rgwch;
#else
lpszFileName = *argv;
#endif
argc--;
}
if (argc)
usage();
// call the apis
if (fList)
lRet = ListSites();
else if (fEnum)
lRet = EnumProviders();
else if (lpszSiteName)
lRet = AdvancedWebPost(lpszSiteName, lpszFileName);
else
lRet = SimpleWebPost(lpszFileName);
return lRet;
}