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.
|
|
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996-1998
//
// File: remotedb.cpp
//
// Contents:
// all routine deal with cross table query
//
// History:
// Feb 4, 98 HueiWang Created
//---------------------------------------------------------------------------
#include "pch.cpp"
#include "globals.h"
#include "remotedb.h"
#include "kp.h"
#include "lkpdesc.h"
#include "keypack.h"
#include "misc.h"
////////////////////////////////////////////////////////////////////////////
DWORD TLSDBRemoteKeyPackAdd( IN PTLSDbWorkSpace pDbWkSpace, IN OUT PTLSLICENSEPACK lpKeyPack ) /*++
--*/ {
DWORD dwStatus = ERROR_SUCCESS; BOOL bSuccess = TRUE; TLSLICENSEPACK found;
if(pDbWkSpace == NULL || lpKeyPack == NULL) { SetLastError(dwStatus = ERROR_INVALID_PARAMETER); TLSASSERT(FALSE); return dwStatus; }
//
// Lock table for update
//
TLSDBLockKeyPackTable();
//
// Quick fix so that find keypack will work.
lpKeyPack->dwPlatformType |= LSKEYPACK_PLATFORM_REMOTE; //lpKeyPack->ucAgreementType |= (LSKEYPACK_REMOTE_TYPE | LSKEYPACK_HIDDEN_TYPE);
lpKeyPack->ucKeyPackStatus |= (LSKEYPACKSTATUS_REMOTE | LSKEYPACKSTATUS_HIDDEN);
LicPackTable& licpackTable = pDbWkSpace->m_LicPackTable;
dwStatus = TLSDBKeyPackEnumBegin( pDbWkSpace, TRUE, LICENSEDPACK_FIND_PRODUCT, lpKeyPack );
if(dwStatus != ERROR_SUCCESS) { goto cleanup; }
while(TRUE) { dwStatus = TLSDBKeyPackEnumNext( pDbWkSpace, &found );
if(dwStatus == TLS_I_NO_MORE_DATA) { break; }
if(_tcsicmp(found.szInstallId, lpKeyPack->szInstallId) == 0) { // find product is based on company name,
// keypack id, product id, platform type, so
// this is duplicate
//
dwStatus = TLS_E_DUPLICATE_RECORD;
if( lpKeyPack->dwNumberOfLicenses == 0 || (lpKeyPack->ucKeyPackStatus & ~LSKEYPACK_RESERVED_TYPE) == LSKEYPACKSTATUS_REVOKED ) { //
// Try to be as fast as possible
//
licpackTable.DeleteRecord(); } else { licpackTable.UpdateRecord(*lpKeyPack); } break; } }
TLSDBKeyPackEnumEnd(pDbWkSpace);
if(dwStatus == TLS_I_NO_MORE_DATA && lpKeyPack->dwNumberOfLicenses > 0) { lpKeyPack->dwKeyPackId = TLSDBGetNextKeyPackId(); bSuccess = licpackTable.InsertRecord(*lpKeyPack);
if(bSuccess == FALSE) { if(licpackTable.GetLastJetError() == JET_errKeyDuplicate) { TLSASSERT(FALSE); // this should no happen
SetLastError(dwStatus=TLS_E_DUPLICATE_RECORD); } else { LPTSTR pString = NULL; TLSGetESEError(licpackTable.GetLastJetError(), &pString);
TLSLogEvent( EVENTLOG_ERROR_TYPE, TLS_E_DBGENERAL, TLS_E_JB_BASE, licpackTable.GetLastJetError(), (pString != NULL) ? pString : _TEXT("") );
if(pString != NULL) { LocalFree(pString); }
SetLastError(dwStatus = SET_JB_ERROR(licpackTable.GetLastJetError())); TLSASSERT(FALSE); } } else { dwStatus = ERROR_SUCCESS; } }
cleanup:
TLSDBUnlockKeyPackTable(); SetLastError(dwStatus); return dwStatus; }
|