Home | History | Annotate | Download | only in base
      1 /*
      2  * libjingle
      3  * Copyright 2004--2005, Google Inc.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are met:
      7  *
      8  *  1. Redistributions of source code must retain the above copyright notice,
      9  *     this list of conditions and the following disclaimer.
     10  *  2. Redistributions in binary form must reproduce the above copyright notice,
     11  *     this list of conditions and the following disclaimer in the documentation
     12  *     and/or other materials provided with the distribution.
     13  *  3. The name of the author may not be used to endorse or promote products
     14  *     derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #ifndef TALK_BASE_WIN32_H_
     29 #define TALK_BASE_WIN32_H_
     30 
     31 #ifdef WIN32
     32 
     33 #ifndef WIN32_LEAN_AND_MEAN
     34 #define WIN32_LEAN_AND_MEAN
     35 #endif
     36 #include <winsock2.h>
     37 #include <windows.h>
     38 
     39 #ifndef SECURITY_MANDATORY_LABEL_AUTHORITY
     40 // Add defines that we use if we are compiling against older sdks
     41 #define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)
     42 #define TokenIntegrityLevel static_cast<TOKEN_INFORMATION_CLASS>(0x19)
     43 typedef struct _TOKEN_MANDATORY_LABEL {
     44     SID_AND_ATTRIBUTES Label;
     45 } TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;
     46 #endif  // SECURITY_MANDATORY_LABEL_AUTHORITY
     47 
     48 #undef SetPort
     49 
     50 #include <string>
     51 
     52 #include "talk/base/stringutils.h"
     53 #include "talk/base/basictypes.h"
     54 
     55 namespace talk_base {
     56 
     57 ///////////////////////////////////////////////////////////////////////////////
     58 
     59 inline std::wstring ToUtf16(const char* utf8, size_t len) {
     60   int len16 = ::MultiByteToWideChar(CP_UTF8, 0, utf8, len, NULL, 0);
     61   wchar_t* ws = STACK_ARRAY(wchar_t, len16);
     62   ::MultiByteToWideChar(CP_UTF8, 0, utf8, len, ws, len16);
     63   return std::wstring(ws, len16);
     64 }
     65 
     66 inline std::wstring ToUtf16(const std::string& str) {
     67   return ToUtf16(str.data(), str.length());
     68 }
     69 
     70 inline std::string ToUtf8(const wchar_t* wide, size_t len) {
     71   int len8 = ::WideCharToMultiByte(CP_UTF8, 0, wide, len, NULL, 0, NULL, NULL);
     72   char* ns = STACK_ARRAY(char, len8);
     73   ::WideCharToMultiByte(CP_UTF8, 0, wide, len, ns, len8, NULL, NULL);
     74   return std::string(ns, len8);
     75 }
     76 
     77 inline std::string ToUtf8(const std::wstring& wstr) {
     78   return ToUtf8(wstr.data(), wstr.length());
     79 }
     80 
     81 // Convert FILETIME to time_t
     82 void FileTimeToUnixTime(const FILETIME& ft, time_t* ut);
     83 
     84 // Convert time_t to FILETIME
     85 void UnixTimeToFileTime(const time_t& ut, FILETIME * ft);
     86 
     87 // Convert a Utf8 path representation to a non-length-limited Unicode pathname.
     88 bool Utf8ToWindowsFilename(const std::string& utf8, std::wstring* filename);
     89 
     90 // Convert a FILETIME to a UInt64
     91 inline uint64 ToUInt64(const FILETIME& ft) {
     92   ULARGE_INTEGER r = {ft.dwLowDateTime, ft.dwHighDateTime};
     93   return r.QuadPart;
     94 }
     95 
     96 enum WindowsMajorVersions {
     97   kWindows2000 = 5,
     98   kWindowsVista = 6,
     99 };
    100 bool GetOsVersion(int* major, int* minor, int* build);
    101 
    102 inline bool IsWindowsVistaOrLater() {
    103   int major;
    104   return (GetOsVersion(&major, NULL, NULL) && major >= kWindowsVista);
    105 }
    106 
    107 inline bool IsWindowsXpOrLater() {
    108   int major, minor;
    109   return (GetOsVersion(&major, &minor, NULL) &&
    110           (major >= kWindowsVista ||
    111           (major == kWindows2000 && minor >= 1)));
    112 }
    113 
    114 // Determine the current integrity level of the process.
    115 bool GetCurrentProcessIntegrityLevel(int* level);
    116 
    117 inline bool IsCurrentProcessLowIntegrity() {
    118   int level;
    119   return (GetCurrentProcessIntegrityLevel(&level) &&
    120       level < SECURITY_MANDATORY_MEDIUM_RID);
    121 }
    122 
    123 bool AdjustCurrentProcessPrivilege(const TCHAR* privilege, bool to_enable);
    124 
    125 ///////////////////////////////////////////////////////////////////////////////
    126 
    127 }  // namespace talk_base
    128 
    129 #endif  // WIN32
    130 #endif  // TALK_BASE_WIN32_H_
    131