File: helper.cpp

package info (click to toggle)
kdevelop 4%3A5.6.2-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 57,892 kB
  • sloc: cpp: 278,773; javascript: 3,558; python: 3,385; sh: 1,317; ansic: 689; xml: 273; php: 95; makefile: 40; lisp: 13; sed: 12
file content (108 lines) | stat: -rw-r--r-- 3,224 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
   Copyright (C) 2003-2005 Jaroslaw Staniek <staniek@kde.org>
   Copyright (C) 2005 Christian Ehrlicher <Ch.Ehrlicher@gmx.de>
   Copyright (C) 2014 Kevin Funk <kfunk@kde.org>

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library 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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this program; see the file COPYING.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.
*/

#include "helper.h"

#include <QDateTime>

#ifndef Q_OS_WIN
#include <sys/time.h>
#else
#include <windows.h>
#include <winsock2.h>
#endif

namespace {

#ifdef Q_OS_WIN

// Copied from kdewin.git's src/time.c

#define KDE_SECONDS_SINCE_1601	11644473600LL
#define KDE_USEC_IN_SEC			1000000LL

void UnixTimevalToFileTime(struct timeval t, LPFILETIME pft)
{
    LONGLONG ll;

    ll = Int32x32To64(t.tv_sec, KDE_USEC_IN_SEC*10) + t.tv_usec*10 + KDE_SECONDS_SINCE_1601*KDE_USEC_IN_SEC*10;
    pft->dwLowDateTime = (DWORD)ll;
    pft->dwHighDateTime = ll >> 32;
}

int utimes(const char *filename, const struct timeval times[2])
{
    FILETIME LastAccessTime;
    FILETIME LastModificationTime;
    HANDLE hFile;

    if(times) {
        UnixTimevalToFileTime(times[0], &LastAccessTime);
        UnixTimevalToFileTime(times[1], &LastModificationTime);
    }
    else {
        GetSystemTimeAsFileTime(&LastAccessTime);
        GetSystemTimeAsFileTime(&LastModificationTime);
    }

    hFile=CreateFileA(filename, FILE_WRITE_ATTRIBUTES, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
            NULL, OPEN_EXISTING, 0, NULL);
    if(hFile==INVALID_HANDLE_VALUE) {
        switch(GetLastError()) {
            case ERROR_FILE_NOT_FOUND:
                errno=ENOENT;
                break;
            case ERROR_PATH_NOT_FOUND:
            case ERROR_INVALID_DRIVE:
                errno=ENOTDIR;
                break;
            case ERROR_ACCESS_DENIED:
                errno=EACCES;
                break;
            default:
                errno=ENOENT; /*what other errors can occur? */
        }
        return -1;
    }

    if(!SetFileTime(hFile, NULL, &LastAccessTime, &LastModificationTime)) {
        /*can this happen? */
        errno=ENOENT;
        return -1;
    }
    CloseHandle(hFile);
    return 0;
}

#endif

}

int Helper::changeAccessAndModificationTime(const QString& filename,
                                            const QDateTime& accessTime, const QDateTime& modificationTime)
{
    struct timeval times[2];
    times[0].tv_usec = 0;
    times[0].tv_sec = accessTime.toSecsSinceEpoch();
    times[1].tv_usec = 0;
    times[1].tv_sec = modificationTime.toSecsSinceEpoch();
    return utimes(filename.toLocal8Bit().constData(), times);
}