したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

管理人の独り言(プログラミング関連)

1626 ◆adhRKFl5jU:2009/03/12(木) 12:50:11
#include "DownloadManager.hpp"

#include <iostream>
#include <string>

#include <cstdlib>
#include <cctype>

#include <windows.h>

#include <cstring>

int Run(const char*, DWORD);
int Init(const char*, DWORD);
std::string GetFileName(std::string);
void Death(const char*);
bool CreateMainProcess(std::string&);

int Run(const char *hash, DWORD pid){
DownloadManager dm(hash);
if(dm.AddPID(pid)){
if(dm.Initialize()){
int ret = dm.Loop();
dm.Finalize();
return ret;
}
}

return -1;
}

int Init(const char *_hash, DWORD pid){
std::string hash(_hash);
{
HANDLE hTesting = CreateMutexA(NULL, FALSE, ("DLTesting1:" + m_hash).c_str());
if(hTesting == NULL){
return -1;
}
HANDLE hRunning = CreateMutexA(NULL, FALSE, ("DLRuning:" + m_hash).c_str());
if(hRunning == NULL){
CloseHandle(hTesting);
return -1;
}
WaitForSingleObject(hTesting, INFINITE);
bool isMutexRunningNonSignal = WaitForSingleObject(hRunning, 0) == WAIT_OBJECT_0;
ReleaseMutex(hTesting);
if(isMutexRunningNonSignal){
ReleaseMutex(hRunning);
}
CloseHandle(hRunning);
CloseHandle(hTesting);

if(isMutexRunningNonSignal){
if(CreateMainProcess(hash)){
return 0;
}else{
return -1;
}
}
}

{
HANDLE hTesting = CreateMutexA(NULL, FALSE, ("DLTesting1:" + m_hash).c_str());
if(hTesting == NULL){
return -1;
}
HANDLE hFlag = CreateEvent(NULL, TRUE, FALSE, ("DLFlag:" + hash).c_str());
if(hFlag == NULL){
return -1;
}
if(GetLastError() == ERROR_ALREADY_EXISTS){

}else{
if(CreateMainProcess(hash))
}
}

return 0;
}

bool

std::string GetFileName(std::string str){
typedef std::string::size_type size_type;

size_type pos = str.find_last_of('\\');
if(pos == std::string::npos){
pos = str.find_last_of('/');
}

if(pos == std::string::npos || pos == str.length() - 1){
return str;
}

return str.substr(pos + 1);
}

int main(int argc, char **argv){
if(argc < 2){
Death("引数が凄く足りません。");
}

const char *hash = NULL;
DWORD pid = ~0;
bool run = false;
for(int i = 1; i < argc; ++i){
if(argv[i][0] == '/' || argv[i][0] == '-'){
switch(argv[i][1]){
case 'h':
case 'H':{
hash = &argv[i][2];
break;
}
case 'i':
case 'I':{
pid = (DWORD)std::atol(&argv[i][2]);
break;
}
case 'r':
case 'R':{
run = true;
break;
}
}
}
}

//コマンドラインが無くても、ここで引っかかるはず。
if(pid == ~0 || hash == NULL){
Death("引数が足りないです。");
}

//パイプの最大の長さは全体で256文字まで。バックスラッシュ以外は利用可能。
//このソフトは英数字以外は利用しないとする。
//256 - nはn文字分確保するため。
{
unsigned int len = 0;
while(hash[len]){
++len;
if(len <= 256 - 15){
if(std::isalpha(hash[len - 1]) || std::isdigit(hash[len - 1])){
}else{
Death("渡されたハッシュに不正な文字が含まれています。");
}
}else{
Death("渡されたハッシュが長すぎます。");
}
}
if(len == 0){
Death("渡されたハッシュがありません。");
}
}

if(run){
return Run(hash, pid);
}

return Init(hash, pid);
}

//エラー吐いて死ぬ
void Death(const char *str){
std::cerr << GetFileName(__argv[0]) << ":" << str << std::endl;
std::exit(-1);
}


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板