Sophie

Sophie

distrib > Mandriva > 2011.0 > i586 > media > contrib-release-debug > by-pkgid > 8fdb0122e54ca71696a6397e0daceb9c > files > 59

bitstormlite-debug-0.2p-5mdv2011.0.i586.rpm

/***************************************************************************
 *   Copyright (C) 2005-2006 Gao Xianchao                                  *
 *                 2007 Gao Xianchao gnap_an linux_lyb ahlongxp            *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

/*
 * Author:	gxc
 * Create data:	2005-01-29 20:09
 */
 
#ifndef _UTILS_H_
#define _UTILS_H_
 
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <dirent.h>
#include <errno.h>
#include <time.h>
#include <string>
#include <cstring>
#include <sstream>
#include <iomanip>
#include <cctype>
#include <algorithm>
#include <stdio.h>
#include <libintl.h>
#include <locale.h>
#include <glib.h>
#include "sha1.h"

#define _(string)			gettext(string)
#define N(string)			string


inline std::string urlEncode(const unsigned char* str, size_t len)
{
		static const char unreserved_chars[] = "-_.!~*()"
			"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
			"0123456789";

		std::stringstream ret;
		ret << std::hex << std::setfill('0');
		for (size_t i = 0; i < len; ++i)
		{
			if (std::count(
					unreserved_chars
					, unreserved_chars+sizeof(unreserved_chars)-1
					, *str))
			{
				ret << *str;
			}
			else
			{
				ret << '%'
					<< std::setw(2)
					<< (int)(*str);
			}
			++str;
		}
		return ret.str();
}

inline std::string getUrlProtocol(const char* url)
{
	std::string str_url=url;
	
	std::string::size_type pos=str_url.find("://");
	if(pos==std::string::npos)
	{
		return "";
	}
	
	return str_url.substr(0, pos);
}

inline bool parseUrl(const char* url,std::string& host,unsigned short* port,std::string& path)
{
	std::string str_url=url;
	
	std::string::size_type pos=str_url.find("://");
	if(pos==std::string::npos)
	{
		return false;
	}
	
	str_url.erase(0,pos+3);
	
	pos=str_url.find(":");
	if(pos==std::string::npos)
	{
		*port=80;
		pos=str_url.find("/");
		if(pos==std::string::npos)
		{
			return false;
		}
		
		host=str_url.substr(0,pos);
		
		str_url.erase(0,pos);
	}
	else
	{
		host=str_url.substr(0,pos);
		
		str_url.erase(0,pos+1);
		
		pos=str_url.find("/");
		if(pos==std::string::npos)
		{
			return false;
		}
		
		std::string str_port=str_url.substr(0,pos);
		*port=(unsigned short)atoi(str_port.c_str());
		
		str_url.erase(0,pos);
	}
	
	if(str_url.length()==0)
	{
		path="/";
	}
	else
	{
		path=str_url;
	}	
	
	return true;
}
 
inline unsigned int GetTickCount()
{
	struct timeval tv;
    gettimeofday( &tv, NULL );
    // this will rollover ~ every 49.7 days
    return (unsigned int)(tv.tv_sec * 1000 + tv.tv_usec / 1000);
}

inline std::string shaString(char* data, size_t len)
{
	unsigned char buf[20];
	sha1_block((unsigned char*)data, len, buf);
	
	std::string result;
	result.append((const char*)buf, sizeof(buf));
	return result;
}

inline bool createDir(const char* path)
{
	std::string strPath = path;
	std::string::size_type pos = strPath.rfind('/');
	if(pos == std::string::npos)
	{
		return false;
	}
	if(pos != strPath.size()-1)
	{
		strPath.erase(pos+1, strPath.size()-pos-1);
	}
	
	std::string dirPath;
	for(;;)
	{
		std::string::size_type pos = strPath.find('/',1);
		if(pos == std::string::npos)
		{
			break;
		}
		
		dirPath += strPath.substr(0, pos);
		DIR* dir = opendir(dirPath.c_str());
		if(dir == NULL)
		{
			if(errno == ENOENT)
			{
				if(-1 == mkdir(dirPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH))
				{
					return false;
				}
			}
			else
			{
				return false;
			}
		}
		
		if(dir != NULL)
		{
			closedir(dir);
		}
		
		strPath.erase(0, pos);
	}
	
	return true;
}

inline std::string extractFileName(const char* fullPath)
{
	std::string strPath = fullPath;
	std::string::size_type pos = strPath.rfind('/');
	if(pos == std::string::npos)
	{
		return fullPath;
	}
	if(pos != strPath.size()-1)
	{
		return strPath.substr(pos+1, strPath.size()-pos-1);
	}
	
	return "";
}

inline std::string extractFilePath(const char* fullPath)
{
	std::string strPath = fullPath;
	std::string::size_type pos = strPath.rfind('/');
	if(pos == std::string::npos)
	{
		return "./";
	}
	if(pos != strPath.size()-1)
	{
		return strPath.substr(0, pos+1);
	}
	
	return fullPath;
}

inline std::string second2Str(unsigned int second)
{
	char buf[128];
	
	if(second<60)
	{
		sprintf(buf, "%u sec", second);
		return buf;
	}
	
	if(second>=60 && second<60*60)
	{
		unsigned int min = second / 60;
		unsigned int sec = second % 60;
		sprintf(buf, "%u min %u sec", min, sec);
		return buf;
	}
	
	unsigned int hou = second/(60*60);
	unsigned int min = (second%(60*60))/60;
	unsigned int sec = second % 60;
	sprintf(buf, "%u hou %u min %u sec", hou, min, sec);
	return buf;	
}

inline std::string byteCount2Str(int64_t count)
{
	char buf[128];
	
	if(count < 1024)
	{
		sprintf(buf, "%d B", (int)count);
		return buf;
	}
	
	if(count>=1024 && count<1024*1024)
	{
		float fcount = ((float)count)/1024.0f;
		sprintf(buf, "%01.2f KB", fcount);
		return buf;
	}
	
	if(count>=1024*1024 && count<1024*1024*1024)
	{
		float fcount = ((float)count)/(1024.0f*1024.0f);
		sprintf(buf, "%01.2f MB", fcount);
		return buf;		
	}
	
	float fcount = ((float)count)/(1024.0f*1024.0f*1024.0f);
	sprintf(buf, "%01.2f GB", fcount);
	return buf;		
}

inline int64_t htonll(int64_t number)
{
	if(htons(1) == 1)
	{
		return number;
	}
	
	return ( htonl( (number >> 32) & 0xFFFFFFFF) |
		 ((int64_t) (htonl(number & 0xFFFFFFFF))  << 32));
}

inline int64_t ntohll(int64_t number)
{
	if(htons(1) == 1)
	{
		return number;
	}
		
 	return ( htonl( (number >> 32) & 0xFFFFFFFF) |
		((int64_t) (htonl(number & 0xFFFFFFFF))  << 32));
}

inline std::string getPeerStr(const char* ip, unsigned short port)
{
	char buf[128];
	sprintf(buf, "%s:%u", ip, port);
	return buf;
}

inline char* convert_to_utf8(const char *input_text, const char *input_enc)
{
	if (input_text == NULL)
		return NULL;
	
	if (input_text[0] == 0)
		return g_strdup(input_text);
	  
	size_t len = strlen(input_text);
	if (!g_utf8_validate(input_text, len, NULL)) {
		gsize b_in, b_out;
		if (input_enc != NULL && *input_enc != 0 && 
				strcasecmp(input_enc, "UTF-8") != 0)
			return g_convert(input_text, len, "UTF-8", input_enc, &b_in, &b_out, NULL);
		else {
			const char *cs;
			if (g_get_charset(&cs) || strcmp(cs, "ANSI_X3.4-1968") == 0) 
				// locale is either already utf8 or ASCII so conversion won't help 
				// - we use fallback character set - iso8859-1
				return g_convert(input_text, len, "UTF-8", "ISO8859-1", &b_in, &b_out, NULL);
			else
				return g_convert(input_text, len, "UTF-8", cs, &b_in, &b_out, NULL);
		}
	}
	return g_strdup(input_text);
}

inline char* convert_from_utf8(const char *input_text, const char *output_enc)
{
	if (input_text == NULL)
		return NULL;
	
	if (input_text[0] == 0)
		return g_strdup(input_text);
	  
	size_t len = strlen(input_text);

	gsize b_in, b_out;
	if (output_enc != NULL && *output_enc != 0 && 
			strcasecmp(output_enc, "UTF-8") != 0)
		return g_convert(input_text, len, output_enc, "UTF-8", &b_in, &b_out, NULL);
	else {
		const char *cs;
		if (g_get_charset(&cs)) 
			// locale is already utf8 so conversion won't help - we use 
			// fallback character set - iso8859-1
			return g_convert(input_text, len,  "ISO8859-1", "UTF-8", &b_in, &b_out, NULL);
		else
			return g_convert(input_text, len, cs, "UTF-8", &b_in, &b_out, NULL);
	}
	return g_strdup(input_text);
}

inline std::string str_to_utf8(const char *input_text, const char *input_enc)
{
	if (input_text == NULL || input_text[0] == '\0')
		return std::string("");
	char *p = convert_to_utf8(input_text, input_enc);
	std::string ret("");
	if (p != NULL) {
		ret = p;
		g_free(p);
	}
	return ret;
}

inline std::string filename_from_utf8(const char *input_text)
{
	gsize bytes_read;
	gsize bytes_written;
	
	gchar* ret = g_filename_from_utf8(input_text, -1, &bytes_read, &bytes_written, NULL);
	std::string result = ret;
	g_free(ret);
	
	return result;
}

inline std::string locale_to_utf8(const char *input_text)
{
	gsize bytes_read;
	gsize bytes_written;
	
	gchar* ret = g_locale_to_utf8(input_text, -1, &bytes_read, &bytes_written, NULL);
	std::string result = ret;
	g_free(ret);
	
	return result;	
}


#endif