Nachdem mein Arbeitslaptop nun seit einiger Zeit mit Linux läuft bin ich vor ein paar Tagen auch Zuhause auf Linux gewechselt. Für manche Games gibt es noch einen Dualboot, aber vieles läuft mittlerweile auch so. Dennoch stellen sich einige Herrausforderungen über die man sich im Windows Universum keine Gedanken machen musste. So nutze ich seit Jahren gerne Google Drive und möchte das auch so beibehalten. Doch für Linux gibt es noch keinen offiziellen gdrive Client. Nun läuft es per grive, einem OpenSource Sync Client + einem eigenem Script bei mir bestens. Lediglich das direkte öffnen von Google Docs Files will per default nicht.

*.gdsheet Dateien

Um Google Drive Dokumente direkt im Browser öffnen zu können gibt es im gdrive Dateien mit der Endung .gdsheet oder .gdform. Diese enthalten den entsprechenden Link zum Google doc als JSON Objekt. Um diese, wie gewohnt, einfach per Doppeltklick zu öffnen habe ich ein kleines tool erstellt welches das handling übernimmt. Bei mir kam eine kleine kompilierbare Datei direkt in C raus die ich der Welt nicht vorenthalten möchte. Es gibt zwar auch andere Lösungen aber Learning by Doing und mühsam ernährt sich... ach lassen wir das.

/* See: http://solariz.de/de/google_drive_linux_gdsheet_handler_gdrive.htm 
   for Information, License or whatever :p */

#include 
#include 
#include     // strlen
#include 

char* readFile(char* filename)
{
    FILE* file = fopen(filename,"r");
    if(file == NULL)
    {
        return NULL;
    }

    fseek(file, 0, SEEK_END);
    long int size = ftell(file);
    rewind(file);

    char* content = calloc(size + 1, 1);

    fread(content,1,size,file);

    return content;
}

const char* escapeshellarg(const char* str) {
    char *esc = strdup(str);
    int i = 0;
    int len = strlen(str) + 1;
 
    while( *str ) {
        if( *str == '\'' || *str == '\\' ) {
            esc[i++] = '\\';
            len += 1;
            esc = (char*)realloc(esc, len);
        }
        esc[i++] = *str++;
    }
    esc = 0;
    return esc;
}

int main ( int argc, char *argv[] )
{
    if ( argc != 2 ) /* argc should be 2 for correct execution */
    {
        /* We print argv[0] assuming it is the program name */
        printf( "usage: %s ", argv[0] );
    }
    else 
    {
        // argv[1] is a filename to open, let's try:
        FILE *file = fopen( argv[1], "r" );

        /* fopen returns 0, the NULL pointer, on failure */
        if ( file == 0 )
        {
            printf( "ERROR: Could not open file!\n" );
        }
        else 
        {
            fclose( file );
            /* read */
            char * raw = readFile(argv[1]);
            json_object * jobj = json_tokener_parse(raw);
            const char * url = json_object_get_string(json_object_object_get(jobj, "url"));
            /* prevent exploding buffer */
            if(strlen(url) > 230) {
                printf("URL String to Long! Maximum 230 Chars!\n");
                exit(0);
            }
            /* only for Google Docs! */
            if(strstr(url, "https://docs.google.com/") != NULL || strstr(url, "https://docs.google.com/") != NULL) {
                printf("Google docs target found!\n");
            } else {
                printf("URL Seems not a google Docs target, break!\n");
                exit(0);
            }
            /* Escape String */
            const char * str = escapeshellarg(url);
            /* and open Browser (only works in Gnome) */
            const char * cmd = "/usr/bin/gnome-open \"";
            char buffer[256]; // <- danger, only storage for 256 char!
            strncpy(buffer, cmd, sizeof(buffer));
            strncat(buffer, str, sizeof(buffer));
            strncat(buffer, "\"", sizeof(buffer));
            //printf("cmd: %s\n",buffer);
            printf("Opening Browser...\n");
            system(buffer);
            /* Over and out */
            exit(1);
        }
    }
}


Getestet und lauffähig in aktuellem Linux Mint so wie wohl jedem Debian Derivat mit Gnome. Vorraussetzung ist lediglich libjson0 und libjson0-dev. Kompiliert wird das ganze dann relativ einfach:

sudo apt-get install gcc libjson0 libjson0-dev
gcc -o gdsheet gdsheet.c -l json
chmod +x gdsheet
sudo mv gdsheet /usr/bin

Danach muss man nur noch im verwendem Filemanager, bei mir Caja, die entsprechende Endung .gdsheet / .gdform mit dem gdsheet binary verknüpfen. Das war es auch schon, beim Doppeltklick auf meine Google Drive Documents öffnet sich nun selbigs wie gewohnt im Chrome. Ich stelle das ganze noch mal mit dem Source und einer bereits kompilierten x64 Version zum Download. GL HF.

DOWNLOAD

gdsheet
[download]

Lizenz?

Für jene die fragen: Public Domain. Do whatever you want.

Amazon Logo Diesen Blog unterstützen?
Bestell dir doch etwas bei Amazon. Nutze diesen speziellen Link, es kostet dich nichts extra und für jeden Kauf darüber erhalte ich eine kleine Gutschrift. Danke!
✉ Marco Götze//

Kommentare

Formate: | Größe: Mb
Anmelden mitoder Benutzernamen eingeben

maTTes
Prima, da freue ich mich drauf. Zum Glück ist ja dein Blog schon lange abonniert :)
★Marco Gö†ze
Werd ich machen, ob das vor der GC noch klappt ist aber fraglich :)
maTTes
Schreibst du demnächst auch noch vielleicht etwas über dein allgemeines Linux-Setup und was du damit machst? Am besten mit Bezug auf Games.