📄 contutils.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/**************************************************************************/
/* ContUtils.cpp */
/* */
/* This file contains utilities to beam contacts using OBEX */
/* */
/* *'ed Functions are DLL entry points */
/* */
/* Functions included: */
/* CloseConnection -- clean up a connection that has ended */
/* ServiceRequest -- process a request (GET/PUT/CONNECT/etc) */
/* *DllServiceCallback -- the entry point from the OBEX server */
/* *DllRegisterServer -- init any required vars that can't be done*/
/* in DLL main */
/* *DllUnregisterServer -- undoes DllRegisterServer */
/* *DllMain -- init critical sections */
/* */
/* Other related files: */
/* */
/* */
/**************************************************************************/
#include <windows.h>
#include "Obex.h"
#include "vcard.h"
#include "VUtils.h"
#include "DeviceChooser.h"
#define RELEASE(x) \
if(x) {x->Release(); x=0;}
#define TRY() __try{
#define TRYCATCH() } __except(1) { ASSERT(FALSE);} __try {
#define CATCH() } __except(1){ASSERT(FALSE);}
extern OID_TRANSLATOR g_sContactOidTranslator[];
char *MakeVCard(CEPROPVAL *pPropVal, UINT retrieved, UINT *uiDtaSize);
void AddLine(VCARD_LINE **vclList,CEPROPVAL *pPropVal, UINT uiTableIdx);
//globals
HINSTANCE g_hInst;
BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
if(DLL_PROCESS_ATTACH == dwReason)
g_hInst = (HINSTANCE)hinstDLL;
return TRUE;
}
/*****************************************************************************/
/* TransmitVCard */
/* Given an array of CEOID's beam out the contacts using OBEX */
/* */
/* Begin by searching for the contacts database, then open it, */
/* parse the records and beam using OBEX */
/* */
/* Returns FALSE on error */
/*****************************************************************************/
int TransmitVCard(HWND hWndParent, PCEOID ceOID, UINT num)
{
//initilize COM
IObex *pObex=0;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
HRESULT hr = CoCreateInstance(CLSID_Obex, NULL, CLSCTX_INPROC_SERVER, IID_IObex,
(void **)&pObex);
if((FAILED(hr)) || (FAILED(pObex->Initialize())))
{
if (pObex)
RELEASE(pObex);
CoUninitialize();
MessageBox(NULL, L"Error getting IObex object", L"Error", MB_OK);
return FALSE;
}
//set device caps
IObexCaps *pObexCaps = NULL;
hr = pObex->QueryInterface(IID_IObexCaps, (LPVOID *)&pObexCaps);
if(SUCCEEDED(hr))
{
pObexCaps->SetCaps(SEND_DEVICE_UPDATES);
pObexCaps->Release();
}
TRY();//BUGBUG
IObexDevice *pObexDevice=0;
if(ChooseService(g_hInst, hWndParent, pObex, &pObexDevice, INBOX_LISTEN_MASK) && pObexDevice)
{
IHeaderCollection *pHeaderCollection=0;
//get a header collection
HRESULT hr = CoCreateInstance(CLSID_HeaderCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_IHeaderCollection,
(void **)&pHeaderCollection);
TRY();//BUGBUG
//now, using the object, connect up
hr = pObexDevice->Connect(0,0,pHeaderCollection);
RELEASE(pHeaderCollection);
if(FAILED(hr))
MessageBox(hWndParent, L"Error connecting", L"Error", MB_OK);
else
{
//open the contacts database
BOOL fFound = FALSE;
HANDLE hEnumDB = CeFindFirstDatabase(0);
CEOID WceObjID;
CEOIDINFO WceObjInfo;
HANDLE hDB;
TRY();//BUGBUG
if(INVALID_HANDLE_VALUE == hEnumDB)
{
RELEASE(pObexDevice);
pObex->Shutdown();
RELEASE(pObex);
return FALSE;
}
TRYCATCH();
//search for the contacts database
while((WceObjID = CeFindNextDatabase(hEnumDB)) != 0) {
if(!CeOidGetInfo(WceObjID, &WceObjInfo)) {
CloseHandle(hEnumDB);
RELEASE(pObexDevice);
pObex->Shutdown();
RELEASE(pObex);
return FALSE;
}
else {
if(wcscmp(_T("Contacts Database"),
WceObjInfo.infDatabase.szDbaseName) == 0)
{
fFound = TRUE;
break;
}
}
}
TRYCATCH();
//open up the contacts database
hDB = CeOpenDatabase(&WceObjID, 0, 0, CEDB_AUTOINCREMENT, NULL);
if(hDB == INVALID_HANDLE_VALUE)
{
RELEASE(pObexDevice);
pObex->Shutdown();
RELEASE(pObex);
return FALSE;
}
TRYCATCH();
//get another header collection
CoCreateInstance(CLSID_HeaderCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_IHeaderCollection,
(void **)&pHeaderCollection);
if(FAILED(hr))
{
RELEASE(pObexDevice);
pObex->Shutdown();
RELEASE(pObex);
return FALSE;
}
TRYCATCH();
//put in the name
pHeaderCollection->AddName(L"PocketPC.vcf");
TRYCATCH();
IStream *myStream=0;
hr = pObexDevice->Put(pHeaderCollection, &myStream);
for(UINT i=0; i<num; i++)
{
TRY();
WORD retrieved=0;
DWORD dwBuf=0;
PBYTE ppBuf=0;
CEPROPVAL *propVal=0;
DWORD dwIndex;
CEOID objId;
HANDLE hHeap;
UINT uiSize=0;
char *dta = 0;
hHeap = HeapCreate(0, 2048, 0);
//seek the contact record
objId = CeSeekDatabase(hDB, CEDB_SEEK_CEOID, ceOID[i], &dwIndex);
//read in the record properties
objId = CeReadRecordPropsEx(hDB,
CEDB_ALLOWREALLOC,
&retrieved,
NULL,
&ppBuf,
&dwBuf,hHeap);
propVal = (CEPROPVAL *)ppBuf;
ASSERT(propVal && retrieved);
dta = MakeVCard(propVal, retrieved, &uiSize);
//transmit the vCard
ULONG ulWritten = 0;
if(dta && uiSize)
{
if(i!=0)
hr = myStream->Write("\n", 1, &ulWritten);
if(SUCCEEDED(hr))
hr = myStream->Write(dta, uiSize, &ulWritten);
if(FAILED(hr) || ulWritten != uiSize)
MessageBox(hWndParent, L"Error occured during transmission.", L"Error", MB_OK);
}
if(dta)
delete [] dta;
HeapDestroy(hHeap);
CATCH();
}
RELEASE(pHeaderCollection);
RELEASE(myStream);
//get ANOTHER header object
hr = CoCreateInstance(CLSID_HeaderCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_IHeaderCollection,
(void **)&pHeaderCollection);
TRYCATCH();//BUGBUG
if(SUCCEEDED(hr))
{
pObexDevice->Disconnect(pHeaderCollection);
RELEASE(pHeaderCollection);
}
else
{
ASSERT(FALSE);
}
CATCH();
}
RELEASE(pObexDevice);
CATCH();//BUGBUG
}
pObex->Shutdown();
RELEASE(pObex);
CoUninitialize();
CATCH();
return TRUE;
}
/*****************************************************************************/
/* MakeStringVCardCompliant */
/* Convert a string so its okay to send in a VCARD */
/* */
/* WARNING: this function allocates memory that it DOESNT FREE */
/* */
/* BUGBUG: Need to encode certain characters */
/* */
/* */
/* Returns FALSE on error */
/*****************************************************************************/
BOOL MakeStringVCardCompliant(LPWSTR in, char **out)
{
char *retVal;
//convert the string from unicode
int requiredSize =
WideCharToMultiByte (CP_ACP, 0, in, -1, 0, 0, NULL, NULL);
retVal = new char[requiredSize];
if(WideCharToMultiByte (CP_ACP, 0, in, -1, retVal, requiredSize, NULL, NULL) == 0)
return FALSE;
*out = retVal;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -