📄 searchc.cpp
字号:
else
{
TraceTag(ttidSsdpSearchResp, "Started search request timer.");
}
InterlockedIncrement(&SearchRequest->nRefCount);
hThread = CreateThread(NULL, 0, DoSsdpSearchThread, (LPVOID) SearchRequest,
0, &ThreadId);
// Get return of the thread.
SearchRequest->hThread = (HANDLE) hThread;
if ((unsigned long) hThread == 0 || (unsigned long) hThread == -1)
{
TraceTag(ttidError, "Falied to create thread. Error:%d",
GetLastError());
InterlockedDecrement(&SearchRequest->nRefCount);
FreeSearchRequest(SearchRequest);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return INVALID_HANDLE_VALUE;
}
else
{
TraceTag(ttidSsdpNotify, "Created thread %d", ThreadId);
}
}
else
{
ASSERT(FALSE);
}
return SearchRequest;
}
VOID DoCancelCallback(PSSDP_SEARCH_REQUEST SearchRequest)
{
if (1 == InterlockedIncrement(&SearchRequest->fExit))
{
StopSearchRequestTimer(SearchRequest);
WakeupSelect(SearchRequest);
}
}
BOOL WINAPI FindServicesClose(HANDLE SearchHandle)
{
PSSDP_SEARCH_REQUEST SearchRequest = (PSSDP_SEARCH_REQUEST) SearchHandle;
BOOL fResult;
fResult = TRUE;
_try
{
// Import to get lock here to guard against SsdpCleanup.
EnterCriticalSection(&SearchRequest->cs);
if (SearchRequest->Type != SSDP_CLIENT_SEARCH_SIGNATURE ||
SearchRequest->Size != sizeof(SSDP_SEARCH_REQUEST) ||
SearchRequest->state == SEARCH_COMPLETED)
{
SetLastError(ERROR_INVALID_PARAMETER);
LeaveCriticalSection(&SearchRequest->cs);
return FALSE;
}
else
{
SearchRequest->state = SEARCH_COMPLETED;
LeaveCriticalSection(&SearchRequest->cs);
if (SearchRequest->Callback != NULL)
{
DoCancelCallback(SearchRequest);
WaitForSingleObject(SearchRequest->hThread, INFINITE);
CloseHandle(SearchRequest->hThread);
}
FreeSearchRequest(SearchRequest);
}
}
_except (1)
{
unsigned long ExceptionCode = _exception_code();
TraceTag(ttidError, "Exception 0x%lx = %ld occurred in "
"FindServicesClose %x", ExceptionCode, ExceptionCode, SearchHandle);
LeaveCriticalSection(&SearchRequest->cs);
fResult = FALSE;
}
return fResult;
}
HANDLE WINAPI FindServices (const char* szType, VOID *pReserved , BOOL fForceSearch)
{
DWORD ReturnValue;
PSSDP_SEARCH_REQUEST SearchRequest;
if (szType == NULL || pReserved != NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
}
SearchRequest = CreateSearchRequest(szType);
if (SearchRequest == NULL)
{
TraceTag(ttidError, "Couldn't allocate memory SearchRequest "
"for %s", szType);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return INVALID_HANDLE_VALUE;
}
// To-Do: Find master
SearchRequest->state = SEARCH_DISCOVERING;
// GetCacheResult(SearchRequest);
// Check ForceSearch
if (fForceSearch == TRUE
//|| IsInListNotify(SearchRequest->szType) == FALSE
)
{
SOCKADDR_IN sockaddrLocal;
sockaddrLocal.sin_family = AF_INET;
sockaddrLocal.sin_addr.s_addr = INADDR_ANY;
sockaddrLocal.sin_port = 0;
SearchRequest->HitWire = TRUE;
SocketOpen(&SearchRequest->WakeupSocket, (PSOCKADDR)&sockaddrLocal, 0, NULL);
OpenSearchSockets(SearchRequest);
SendSearchRequest(SearchRequest);
SearchRequest->dwTimerCookie = SearchRequest->ThreadPool.StartTimer(SearchRequestTimerProc, (VOID *) SearchRequest, MX_VALUE);
if (SearchRequest->dwTimerCookie == 0)
{
TraceTag(ttidError, "Failed to start search request timer.");
SocketClose(SearchRequest->WakeupSocket);
CloseSearchSockets(SearchRequest);
FreeSearchRequest(SearchRequest);
SetLastError(ERROR_TIMER_START_FAILED);
return INVALID_HANDLE_VALUE;
}
else
{
TraceTag(ttidSsdpSearchResp, "Started search request timer.");
}
ReturnValue = DoSsdpSearch(SearchRequest);
if (ReturnValue != 0)
{
FindServicesClose(SearchRequest);
return INVALID_HANDLE_VALUE;
}
}
if (IsListEmpty(&SearchRequest->ListResponses))
{
FindServicesClose(SearchRequest);
SetLastError(ERROR_NO_MORE_SERVICES);
return INVALID_HANDLE_VALUE;
}
else
{
return SearchRequest;
}
}
BOOL WINAPI GetFirstService (HANDLE hFindServices, PSSDP_MESSAGE *ppSsdpService)
{
PSSDP_SEARCH_REQUEST SearchRequest = (PSSDP_SEARCH_REQUEST) hFindServices;
PLIST_ENTRY pListHead;
*ppSsdpService = NULL;
_try
{
if (SearchRequest->Type != SSDP_CLIENT_SEARCH_SIGNATURE ||
SearchRequest->Size != sizeof(SSDP_SEARCH_REQUEST))
{
return FALSE;
}
pListHead = &SearchRequest->ListResponses;
SearchRequest->CurrentResponse = pListHead->Flink;
if (SearchRequest->CurrentResponse != pListHead)
{
PSSDP_MESSAGE_ITEM pMessageItem;
pMessageItem = CONTAINING_RECORD (SearchRequest->CurrentResponse,
SSDP_MESSAGE_ITEM , linkage);
*ppSsdpService = pMessageItem->pSsdpMessage;
SearchRequest->CurrentResponse = SearchRequest->CurrentResponse->Flink;
return TRUE;
}
else
{
return FALSE;
}
}
_except (1)
{
unsigned long ExceptionCode = _exception_code();
TraceTag(ttidError, "Exception 0x%lx = %ld occurred in "
"GetFirstService %x", ExceptionCode,
ExceptionCode, hFindServices);
return FALSE;
}
}
BOOL WINAPI GetNextService (HANDLE hFindServices, PSSDP_MESSAGE *ppSsdpService)
{
PSSDP_SEARCH_REQUEST SearchRequest = (PSSDP_SEARCH_REQUEST) hFindServices;
PLIST_ENTRY pListHead;
_try
{
if (SearchRequest->Type != SSDP_CLIENT_SEARCH_SIGNATURE ||
SearchRequest->Size != sizeof(SSDP_SEARCH_REQUEST))
{
return FALSE;
}
pListHead = &SearchRequest->ListResponses;
if (SearchRequest->CurrentResponse != pListHead)
{
PSSDP_MESSAGE_ITEM pMessageItem;
pMessageItem = CONTAINING_RECORD (SearchRequest->CurrentResponse,
SSDP_MESSAGE_ITEM , linkage);
*ppSsdpService = pMessageItem->pSsdpMessage;
SearchRequest->CurrentResponse = SearchRequest->CurrentResponse->Flink;
return TRUE;
}
else
{
return FALSE;
}
}
_except (1)
{
unsigned long ExceptionCode = _exception_code();
TraceTag(ttidError, "Exception 0x%lx = %ld occurred in "
"GetNextService %x", ExceptionCode, ExceptionCode, hFindServices);
return FALSE;
}
}
VOID FreeSearchRequest(PSSDP_SEARCH_REQUEST SearchRequest)
{
Assert(SearchRequest);
long refCnt = InterlockedDecrement(&SearchRequest->nRefCount);
if(refCnt == 0)
{
PLIST_ENTRY pListHead = &SearchRequest->ListResponses;
PLIST_ENTRY p = pListHead->Flink;
EnterCriticalSection(&SearchRequest->cs);
while (p != pListHead)
{
PSSDP_MESSAGE_ITEM pMessageItem;
pMessageItem = CONTAINING_RECORD (p, SSDP_MESSAGE_ITEM , linkage);
p = p->Flink;
RemoveEntryList(&pMessageItem->linkage);
FreeSsdpMessage(pMessageItem->pSsdpMessage);
free(pMessageItem);
}
if(SearchRequest->DoneEvent)
CloseHandle(SearchRequest->DoneEvent);
if(SearchRequest->szType)
free(SearchRequest->szType);
if(SearchRequest->szSearch)
free(SearchRequest->szSearch);
LeaveCriticalSection(&SearchRequest->cs);
DeleteCriticalSection(&SearchRequest->cs);
delete SearchRequest;
}
}
BOOL AddRequestToListResponse(PLIST_ENTRY ListResponse, const SSDP_MESSAGE *pSsdpMessageIn)
{
PSSDP_MESSAGE_ITEM pMessageItem;
PSSDP_MESSAGE pSsdpMessage;
pMessageItem = (PSSDP_MESSAGE_ITEM) malloc(sizeof(SSDP_MESSAGE_ITEM));
if (pMessageItem == NULL)
{
return FALSE;
}
if (pSsdpMessage = CopySsdpMessage(pSsdpMessageIn) )
{
pMessageItem->pSsdpMessage = pSsdpMessage;
InsertHeadList(ListResponse, &(pMessageItem->linkage));
return TRUE;
}
else
{
TraceTag(ttidError, "Failed to allocate memory for SsdpMessage.");
free(pMessageItem);
return FALSE;
}
}
BOOL IsInTheListResponse(PSSDP_SEARCH_REQUEST SearchRequest, CHAR* szUSN)
{
PLIST_ENTRY p;
PLIST_ENTRY pListHead;
EnterCriticalSection(&SearchRequest->cs);
pListHead = &SearchRequest->ListResponses;
p = pListHead->Flink;
while (p != pListHead)
{
PSSDP_MESSAGE_ITEM pMessageItem;
pMessageItem = CONTAINING_RECORD (p, SSDP_MESSAGE_ITEM , linkage);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -