Torna indietro   Hardware Upgrade Forum > Software > Linux, Unix, OS alternativi

Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-07-2007, 00:58   #1
3nigma666
Senior Member
 
L'Avatar di 3nigma666
 
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
mai visto errore del genere nel make install.. cosa è ???

Sto provando ad installare bemused, un programma che fa da server per gestire xmms da bluetooth con il cellulare..
solo che quando faccio il make install mi da questo errore :

Codice:
enigma@enigma-desktop:~/Desktop/bemusedlinuxserver1.73$ sudo make install
Password:
g++ -o bemusedlinuxserver -I/usr/include/xmms -I./ -lxmms -lbluetooth `gtk-config --libs --cflags` main.cpp BemusedServerDlg.cpp
./BemusedServerDlg.h:66: error: extra qualification ‘CBemusedServerDlg::’ on member ‘ReadFile’
./BemusedServerDlg.h:67: error: extra qualification ‘CBemusedServerDlg::’ on member ‘ReadFile’
./BemusedServerDlg.h:68: error: extra qualification ‘CBemusedServerDlg::’ on member ‘WriteFile’
./BemusedServerDlg.h:69: error: extra qualification ‘CBemusedServerDlg::’ on member ‘WriteFile’
./BemusedServerDlg.h:70: error: extra qualification ‘CBemusedServerDlg::’ on member ‘GetLastError’
./BemusedServerDlg.h:102: error: extra qualification ‘CBemusedServerDlg::’ on member ‘AddBookmarks’
BemusedServerDlg.h:66: error: extra qualification ‘CBemusedServerDlg::’ on member ‘ReadFile’
BemusedServerDlg.h:67: error: extra qualification ‘CBemusedServerDlg::’ on member ‘ReadFile’
BemusedServerDlg.h:68: error: extra qualification ‘CBemusedServerDlg::’ on member ‘WriteFile’
BemusedServerDlg.h:69: error: extra qualification ‘CBemusedServerDlg::’ on member ‘WriteFile’
BemusedServerDlg.h:70: error: extra qualification ‘CBemusedServerDlg::’ on member ‘GetLastError’
BemusedServerDlg.h:102: error: extra qualification ‘CBemusedServerDlg::’ on member ‘AddBookmarks’
make: *** [bemusedlinuxserver] Error 1
enigma@enigma-desktop:~/Desktop/bemusedlinuxserver1.73$
che roba è ??!?!? mai vista prima...
3nigma666 è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2007, 08:50   #2
aik
Member
 
L'Avatar di aik
 
Iscritto dal: Nov 2004
Città: pisa
Messaggi: 204
E' una cosa che hanno introdotto nelle ultime versioni del g++, prova ad usare una versione più vecchia oppure edita il file BemusedServerDlg.h e togli CBemusedServerDlg:: dalle dichiarazioni delle funzioni
aik è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2007, 18:51   #3
3nigma666
Senior Member
 
L'Avatar di 3nigma666
 
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
Quote:
Originariamente inviato da aik Guarda i messaggi
E' una cosa che hanno introdotto nelle ultime versioni del g++, prova ad usare una versione più vecchia oppure edita il file BemusedServerDlg.h e togli CBemusedServerDlg:: dalle dichiarazioni delle funzioni
è una specie di bug ?!?!
3nigma666 è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2007, 18:57   #4
3nigma666
Senior Member
 
L'Avatar di 3nigma666
 
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
non posso toglierlo dagli include , perke come immaginavo crea una marea di errori... che versione devo usare di g++ ?
3nigma666 è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2007, 20:38   #5
aik
Member
 
L'Avatar di aik
 
Iscritto dal: Nov 2004
Città: pisa
Messaggi: 204
Non è un bug, anzi...
nelle ultime versioni del g++ hanno proibito di fare una cosa così
Codice:
class myClass{
public:
void myClass::WriteFile();
}
perchè sarebbe ridondante.
bisogna fare così invece:
Codice:
class myClass{
public:
void WriteFile();
}
Non so che versione del g++ vada bene...
aik è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 09:01   #6
3nigma666
Senior Member
 
L'Avatar di 3nigma666
 
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
Quote:
Originariamente inviato da aik Guarda i messaggi
Non è un bug, anzi...
nelle ultime versioni del g++ hanno proibito di fare una cosa così
Codice:
class myClass{
public:
void myClass::WriteFile();
}
perchè sarebbe ridondante.
bisogna fare così invece:
Codice:
class myClass{
public:
void WriteFile();
}
Non so che versione del g++ vada bene...
quindi mi basterebbe aprire il sorgente e correggere quel problema che hai descritto tu ?
3nigma666 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 09:20   #7
3nigma666
Senior Member
 
L'Avatar di 3nigma666
 
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
questo è il sorgente...
non riesco a trovare l'errore

Codice:
#include <stdlib.h>
#include <iostream>
#include <fstream>

#include <errno.h>
#include <signal.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

#include <netinet/in.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <netdb.h>
#include <sys/socket.h>

#ifndef AFFIX /* Bluez BT stack */
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#else /* Affix BT stack */
#include <affix/btcore.h>
#include <affix/sdpclt.h>
#include <affix/sdpsrv.h>
#endif

#include <xmmsctrl.h>
#include "BemusedServerDlg.h"

using namespace std;

/* Test modes */
enum {
	SEND,
	RECV,
	RECONNECT,
	MULTY,
	DUMP,
	CONNECT,
	CRECV,
	LSEND
};

const static char bookpath[] = "Bookmarks/";
char wbookpath[1024]; // has any paths added or removed


#ifdef AFFIX

BD_ADDR bdaddr;

void baswap(BD_ADDR *dst, BD_ADDR *src)
{
	unsigned char *d = (unsigned char *) dst;
	unsigned char *s = (unsigned char *) src;
	int i;

	for (i = 0; i < 6; i++)
		d[i] = s[5 - i];
}

char *batostr(BD_ADDR *ba)
{
	static char str[2][18];
	static int i = 1;

	i ^= 1;
	sprintf(str[i], "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
	        ba->bda[0], ba->bda[1], ba->bda[2],
		ba->bda[3], ba->bda[4], ba->bda[5]);

	return str[i];
}

static int	srvHandle = -1;
static sdpsvc_t	*svcRec;

void sdpreg_cleanup(void)
{
	sdp_close(srvHandle);
	sdp_cleanup();
}


int sdpreg_init(void)
{
        // initialize the SDP internal data structures

        if (sdp_init(SDP_SVC_PROVIDER) != 0)
                return -1;
        srvHandle = sdp_connect_local();
        if (srvHandle < 0)
                return srvHandle;
        return 0;
}

int sdpreg_serialport(int port)
{
        int	status = -1;

	svcRec = sdp_create_rfcomm_svc(SDP_UUID_SERIAL_PORT, 0x0000,
                       SDP_UUID_SERIAL_PORT,"Bemused", "Coolstuff", "Music",port);
    
	
        if (svcRec == NULL) {
                BTERROR("sdp_create_svc failed");
                return -1;
        }
        status = sdp_register_service(srvHandle, svcRec);
        if (status != 0) {
                BTERROR("sdp_register_service failed");
                sdp_free_svc(svcRec);
                return -1;
        }
        return 0;
}

int sdpreg_unregister()
{
	intstatus;
	if (!svcRec) return 0;
	status = sdp_delete_service(srvHandle, svcRec);
	sdp_free_svc(svcRec);
	svcRec = NULL;
	return 0;
}


#else

bdaddr_t bdaddr;
#endif


/////////////////////////////////////////////////////////////////////////////
// CDirTreeNode class

CDirTreeNode::CDirTreeNode()
	{
	iFirstChild = NULL;
	iNextSibling = NULL;
	iParent = NULL;
	iFileName = NULL;
	iNodeType = iFileType = 0x0;
	iWrittenToBuffer = false;
	}

CDirTreeNode::~CDirTreeNode()
	{
	delete iFirstChild;
	delete iNextSibling;
	delete iFileName;
	}

/////////////////////////////////////////////////////////////////////////////
// CBemusedServerDlg dialog

CBemusedServerDlg::CBemusedServerDlg()
	
	{
	iDirTreeRoot = iDirTreeCurrentNode = NULL;
	lastTime = 0;
	}

CBemusedServerDlg::~CBemusedServerDlg()
	{
	delete iDirTreeRoot;
  close(iCommHandle);
  close(socket1);
  }

bool CBemusedServerDlg::OnInitDialog(bool daemonize)
{
	Log("Welcome to Bemused 1.73\r\n");
	Log("Copyright Ashley Montanaro 2003\r\n");
	Log("Linux port from Daniel Winter\r\n\r\n");

	ReadIniFile();
	socket1=BluetoothConnectToSocket(channel);

	CheckWinamp("Blub");
	//xmms_remote_set_main_volume(0,47);
	
	if (daemonize)
	{
		Log("daemonizing\n");
		if (daemon(0, 1) < 0)
		{
			perror("daemon");
			exit(1);
		}
		fclose (stdout);
	}

	while(1) 
	{
		iCommHandle=BluetoothWaitforConnect(socket1);
		 HandleBluetooth();
	}
	return true;  
	}


void CBemusedServerDlg::ReadIniFile()
	{
  bool mp3set=false,autoset=false,xmmsdirset=false,fastforbackspeedset=false;
  bool	channelset=false,bookmarkset=false,bookmarkread=false,portset=false;
  char row[1025],wert[1025],einstellung[100];
  tcpport=7654;
  channel=10;
  tcp=false;
  strcpy(winampPath,"xmms");
  startAutomatically=1;
  ifstream conffile("/etc/bemused.conf");
  if (!conffile) {
    Log("Could not read the configfile /etc/bemused.conf\n\r");
    exit(2);
  }
  while (conffile.getline(row,1024))
  {
    if (!(row[0]=='#') && !(row[0]=='\0'))
    {
     strcpy(einstellung,strtok(row, "="));
     strcpy(wert,strtok(NULL,"="));
     if (!strcmp(einstellung,"mp3dir"))
     {
       strcpy(mp3Dirs,wert);
       mp3set=true;
     }
     if (!strcmp(einstellung,"tcp"))
     {
       int tmptcp;
       tmptcp=atoi(wert);
       if (tmptcp==1) tcp=true;
     }
     if (!strcmp(einstellung,"channel"))
     {
       channel=atoi(wert);
       channelset=true;
     }
     if (!strcmp(einstellung,"tcpport"))
     {
       tcpport=atoi(wert);
       portset=true;
     }
     if (!strcmp(einstellung,"fastforbackspeed"))
     {
       fastforbackspeed=atoi(wert);
       fastforbackspeedset=true;
     }
     if (!strcmp(einstellung,"xmmsdir"))
     {
       strcpy(winampPath,wert);
       xmmsdirset=true;
     }
     if (!strcmp(einstellung,"bookmarkfile"))
     {
       strcpy(bookmarkfile,wert);
       bookmarkset=true;
       bookmarkread=false;
     }
     if (!strcmp(einstellung,"autostartxmms"))
     {
       if (!strcmp(wert,"1")) startAutomatically=1; else startAutomatically=0;
       autoset=true;
     }
   }
  }
  conffile.close();
  if (!(mp3set))
    {
      Log("Configfile is not written correctly\n\r");
      exit(3);
    }
  if ((!channelset) && (!tcp))
   {
     Log("Warning: No channel defined in config file using default=10\n\r");
   }
   if ((!portset) && tcp)
   {
     Log("Warning: No port defined in config file using default=7654\n\r");
   }

  // Read in bookmarks if we have them
  nobookmarks = 0;
  if (bookmarkset)
    {
      ifstream bookfile(bookmarkfile);
      if (!bookfile) {
         Log("Could not read the bookmakrs file %s\n",bookmarkfile);
         exit(2);
      }

      while (bookfile.getline(row,1024))
        {
          if (!(row[0]=='#') && !(row[0]=='\0'))
             {
		strcpy(einstellung,strtok(row, "="));
                strcpy(wert,strtok(NULL,"="));

		// Trim any spaces out
		while( einstellung[strlen(einstellung)-1]==' ' )
		   {
		       einstellung[strlen(einstellung)-1] = '\0';
		   }
		while( wert[strlen(wert)-1]==' ' )
		   {
		       wert[strlen(wert)-1] = '\0';
		   }
		char altwert[1025];
		while( wert[0]==' ' )
		  {
	             strcpy(altwert,&wert[1]);
		     strcpy(wert,altwert);
		  }

		Log("I have a bookmark \"%s\" of \"%s\"\n",einstellung,wert);

		// Save this
		strcpy(bookmarks[nobookmarks],wert);
		strcpy(bookmarktitles[nobookmarks],einstellung);
		nobookmarks++;
             }
	}
    }
	if (!fastforbackspeedset) fastforbackspeed=10000;
	}



void CBemusedServerDlg::HandleBluetooth()
	{
	iExitNow = false;
	do {
		ReadBluetoothCommand();
		} while (!iExitNow);
	close(iCommHandle);
	}

bool CBemusedServerDlg::WriteFile(int handle,unsigned char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla)
  {
  long unsigned int b;
  int br;
  br=write(handle,(void*)buffer,maxbytes);
  if (br==-1) {
     return false;
     }
     else {
     b=(long unsigned int)(br);
     *(byteswritten)=b;
     return true;
  }
  }


bool CBemusedServerDlg::WriteFile(int handle, char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla)
  {
  long unsigned int b;
  int br;
  br=write(handle,(void*)buffer,maxbytes);
  if (br==-1) {
     return false;
     }
     else {
     b=(long unsigned int)(br);
     *(byteswritten)=b;
     return true;
  }
  }

bool CBemusedServerDlg::ReadFile(int handle,unsigned char* buffer,int maxbytes,long unsigned int* bytesread,int* bla)
  {
    long unsigned int b;
    int br;
    br=recv(handle, (void*)buffer, maxbytes,0);
    if (br<=0) {
      return false;
      }
      else {
      b=(long unsigned int)(br);
      *(bytesread)=b;
      return true;
      }

  }


bool CBemusedServerDlg::ReadFile(int handle,char* buffer,int maxbytes,long unsigned int* bytesread,int* bla)
  {
    long unsigned int b;
    int br;
    br=recv(handle, (void*)buffer, maxbytes,0);
    if (br<=0) {
      return false;
      }
      else {
      b=(long unsigned int)(br);
      *(bytesread)=b;
      return true;
      }

  }

void CBemusedServerDlg::ReadBluetoothCommand()
	{
	char buffer[5];
	unsigned long bytes_read = 0;

	memset(buffer, 0, 5);
	if (!ReadFile(iCommHandle, buffer, 4, &bytes_read, NULL))
		{

		if (!tcp) Log("Couldn't read command: %s\r\n", GetLastError());
		 else Log("Couldn't read command: Probably peer closed connection\r\n");
		iExitNow = true;
		}
	else
		{
//		MessageBox(buffer);

	CheckWinamp("blub");

	// List "neutral" commands first
	if (!strcmp(buffer, "LIST"))
			WriteListToPhone();
		else if (!strcmp(buffer, "DLST"))
			WriteDirectoryListToPhone();
		else if (!strcmp(buffer, "PLST"))
			WritePlaylistToPhone();
		else if (!strcmp(buffer, "FINF"))
			GetFileInfo();
		else if (!strcmp(buffer, "DOWN"))
			DownloadFile();
		else if (!strcmp(buffer, "VOLM"))
			SetVolume();
		else if (!strcmp(buffer, "CHCK"))
			Check();
		else if (!strcmp(buffer, "VERS"))
			Version();
		else if (!strcmp(buffer, "GVOL"))
			GetVolume();
		else if (!strcmp(buffer, "INFO")) 
			WriteInfoToPhone();
		else if (!strcmp(buffer, "INF2")) 
			WriteInf2ToPhone();
		else if (!strcmp(buffer, "DINF"))
			WriteDetailedInfoToPhone();
		else if (!strcmp(buffer, "RMAL"))
			RemoveAllFromPlaylist();
		else {
			// Put it in braces to avoid extraneous Log output
			// Don't stop at end if any other command is executed
			iStopEnd = false;
			
			if (!strcmp(buffer, "PLAY"))
				PlayFile(false);
			else if (!strcmp(buffer, "LADD"))
				PlayFile(true);
			else if (!strcmp(buffer, "STOP"))
				Stop(true);
			else if (!strcmp(buffer, "FADE"))
				FadeOut();	
			else if (!strcmp(buffer, "STEN")) {
				Log("Will stop at start of next song\n");
				iStopEnd=true;
			} else if (!strcmp(buffer, "PAUS"))
				Pause();
			else if (!strcmp(buffer, "STRT"))
				Play();
			else if (!strcmp(buffer, "SLCT"))
				SelectInPlaylist();
			else if (!strcmp(buffer, "PREV"))
				PreviousTrack();
			else if (!strcmp(buffer, "NEXT"))
				NextTrack();
			else if (!strcmp(buffer, "FFWD"))
				FastForward();
			else if (!strcmp(buffer, "SEEK"))
				SetSeek();
			else if (!strcmp(buffer, "RWND"))
				Rewind();
			else if (!strcmp(buffer, "SHFL"))
				Shuffle();
			else if (!strcmp(buffer, "REPT"))
				Repeat();
			else if (!strcmp(buffer, "SHUT"))
				ShutDown();
			else if (!strcmp(buffer, "EXIT"))
				exit(0);
			else
				Log("Read unknown command \"%s\"\r\n", buffer);
		}
 }
}

void CBemusedServerDlg::ReadDir(char* aDir, CDirTreeNode* aNode, bool aRecursive)
	{
	char fileNameBuf[MAX_PATH+1];
	sprintf(fileNameBuf, "%s/*.*", aDir);

  DIR *dir;
  struct dirent *dirzeiger;
  struct stat attribut;

  if ((dir=opendir(aDir)) == NULL)
    {
		Log("Couldn't open \"%s\"\r\n", aDir);
		return;
    }

	int foundCount = 0;

	CDirTreeNode* currentNode = aNode;


	while((dirzeiger=readdir(dir)) != NULL) {
		if (!strcmp((*dirzeiger).d_name, ".") || !strcmp((*dirzeiger).d_name, ".."))
			continue;

		if (foundCount == 0)
			{
			aNode->iFirstChild = new CDirTreeNode;
			aNode->iFirstChild->iParent = currentNode;
			currentNode = aNode->iFirstChild;
			currentNode->iNodeType = 0x1; // child
			}
		else
			{
			currentNode->iNextSibling = new CDirTreeNode;
			currentNode->iNextSibling->iParent = currentNode->iParent;
			currentNode = currentNode->iNextSibling;
			currentNode->iNodeType = 0x3; // sibling
			}

		foundCount++;

		sprintf(fileNameBuf, "%s/%s", aDir, (*dirzeiger).d_name);
		currentNode->iFileName = strdup((*dirzeiger).d_name);


    if (stat(fileNameBuf,&attribut)==-1) Log("Fehler: %s\r\n",GetLastError());
      if (S_ISDIR(attribut.st_mode))

			{
//			MessageBox("Found dir:");
//			MessageBox(fileNameBuf);

			if (aRecursive)
				{
				currentNode->iFileType = 0x1;
				ReadDir(fileNameBuf, currentNode, true);
				}
			else
				{
				currentNode->iFileType = 0x3;
				}
			}
		else
			{
//  	  MessageBox("Found file:");
   			Log("File Found: %s\r\n",fileNameBuf);

			currentNode->iFileType = 0x2;
			}

		}

	// if the last node was a child, make it an only child
	if (currentNode->iNodeType == 0x1)
		currentNode->iNodeType = 0x2;
	// if the last node was a sibling, make it the last sibling
	if (currentNode->iNodeType == 0x3)
		currentNode->iNodeType = 0x4;

	closedir(dir);
	}

// Looks for xmms, starting it if necessary. Returns whether
// xmms is running now

bool CBemusedServerDlg::CheckWinamp(const char* aWindowName)
	{
	
	if (!xmms_remote_is_running(0) && startAutomatically)
		{
		 if (!fork()) {
      system(winampPath);
      exit(0);
      }
     sleep(2);
		}

	if (xmms_remote_is_running(0))
		return true;

	return false;
	}

void CBemusedServerDlg::FadeOut()
	{
	int curVol = xmms_remote_get_main_volume(0);
	int deltaVol = curVol / 10;  // 10*0.5s = 5 seconds
	Log("curVol=%i\n",curVol);
	for(int v=curVol;v>0;v-=deltaVol) 
		{
		Log("Set volume to %i%\n",v);
		xmms_remote_set_main_volume(0,v);
		usleep(500000); // 0.5 seconds
		}
	xmms_remote_set_main_volume(0,0);
	Log("Set volume to %i%\n",0);
	usleep(500000);
	Stop(true);
	sleep(1); // Give time for Stop
	Log("Resetting volume to %i%\n",curVol);
	xmms_remote_set_main_volume(0,curVol);
	}

	
void CBemusedServerDlg::WriteDetailedInfoToPhone()
	{
	// Our variables
	int bitrate = 0;
	int samplerate = 0;
	int nochannels = 0;
	int i;
	char buffer[1024];

	// Get _current_ bit rate, sample rate and number of channels
        xmms_remote_get_info(0, &bitrate, &samplerate, &nochannels);

	// bps => kbps and Hz => kHz
	bitrate /= 1024;
	samplerate /= 1000;

 	Log("Got the song info, %d kbps, %d kHz, %d channels\n",
			bitrate,samplerate,nochannels);

	// Stuff this lot into buffer
	strcpy(buffer, "DINFACK");

	// Anyone think we ought to have a macro for this stuff?
	buffer[7] = bitrate >> 24;
	buffer[8] = (bitrate >> 16) & 0xFF;
	buffer[9] = (bitrate >> 8) & 0xFF;
	buffer[10] = bitrate & 0xFF;
	
	buffer[11] = samplerate >> 24;
	buffer[12] = (samplerate >> 16) & 0xFF;
	buffer[13] = (samplerate >> 8) & 0xFF;
	buffer[14] = samplerate & 0xFF;

	buffer[15] = nochannels >> 24;
	buffer[16] = (nochannels >> 16) & 0xFF;
	buffer[17] = (nochannels >> 8) & 0xFF;
	buffer[18] = nochannels & 0xFF;

	buffer[19] = '\0';

	unsigned long bytesWritten;

	WriteFile(iCommHandle, buffer, (19), &bytesWritten, NULL);
	if (bytesWritten < 19)
		Log("Only wrote %d bytes of DINFACK\r\n", bytesWritten);

	Log("Sent the Track Info to the phone\n");

	}

void CBemusedServerDlg::WriteInfoToPhone()
	{
  	// Get the length of the song.
	int songLength;
	int count = 0;
	usleep(100000);
	do 
		{
		songLength = xmms_remote_get_playlist_time(0,xmms_remote_get_playlist_pos(0));
		usleep(50);
		count++;
		} while ((songLength == -1) && (count < 100));
	
	if(songLength<0) songLength=0;
	songLength/=1000;

	unsigned char isPlaying=0x0;
	if (xmms_remote_is_playing(0)) isPlaying=0x1;
	if (xmms_remote_is_paused(0)) isPlaying=0x2;


	int currentTime = xmms_remote_get_output_time(0);
	iStopNow = (iStopEnd && currentTime<lastTime);
	lastTime = currentTime; 

	// current time is in milliseconds, we want seconds.
	currentTime /= 1000;

	unsigned char repeat,shuffle;
	if (xmms_remote_is_repeat(0)) repeat=0x01; else repeat=0x00;
	if (xmms_remote_is_shuffle(0)) shuffle=0x01; else shuffle=0x00;

  
	char buffer[1024];
	char title[255];
	unsigned int titlelength;

	if(songLength) 
		{
		strcpy(title,xmms_remote_get_playlist_title(0,xmms_remote_get_playlist_pos(0)));
		titlelength = strlen(title);
		} 
	else 
		{
		title[0]='\0';
		titlelength=0;
  		}
  
	strcpy(buffer, "INFOACK");
	buffer[7] = isPlaying;

	buffer[8] = songLength >> 24;
	buffer[9] = (songLength >> 16) & 0xFF;
	buffer[10] = (songLength >> 8) & 0xFF;
	buffer[11] = songLength & 0xFF;

	buffer[12] = currentTime >> 24;
	buffer[13] = (currentTime >> 16) & 0xFF;
	buffer[14] = (currentTime >> 8) & 0xFF;
	buffer[15] = currentTime & 0xFF;

	buffer[16] = shuffle;
	buffer[17] = repeat;
	strcpy(buffer+18,title);
  
	unsigned long bytesWritten;

	WriteFile(iCommHandle, buffer, (18+titlelength), &bytesWritten, NULL);
	if (bytesWritten < (18+titlelength))
		Log("Only wrote %d bytes of INFOACK\r\n", bytesWritten);
	if(iStopEnd && iStopNow) 
		{
			Stop(true);
			iStopEnd = iStopNow = false;
		}
	}

void CBemusedServerDlg::WriteInf2ToPhone()
	{
  	// Get the length of the song.
	int songLength;
	int count = 0;
	do 
		{
		songLength = xmms_remote_get_playlist_time(0,xmms_remote_get_playlist_pos(0));
		usleep(50);
		count++;
		} while ((songLength == -1) && (count < 100));
	
	if(songLength<0) songLength=0;
	songLength/=1000;

	unsigned char isPlaying=0x0;
	if (xmms_remote_is_playing(0)) isPlaying=0x1;
	if (xmms_remote_is_paused(0)) isPlaying=0x2;


	int currentTime = xmms_remote_get_output_time(0);
	iStopNow = (iStopEnd && currentTime<lastTime);
	lastTime = currentTime; 

	// current time is in milliseconds, we want seconds.
	currentTime /= 1000;

	unsigned char repeat,shuffle;
	if (xmms_remote_is_repeat(0)) repeat=0x01; else repeat=0x00;
	if (xmms_remote_is_shuffle(0)) shuffle=0x01; else shuffle=0x00;

  
	char buffer[1024];
	char title[255];
	unsigned int titlelength;
	memset(buffer, 0, sizeof(buffer));
	if(songLength) 
		{
		strcpy(title,xmms_remote_get_playlist_title(0,xmms_remote_get_playlist_pos(0)));
		titlelength = strlen(title);
		} 
	else 
		{
		title[0]='\0';
		titlelength=0;
  		}
  
	strcpy(buffer, "INF2ACK");
	buffer[7] = isPlaying;

	buffer[8] = songLength >> 24;
	buffer[9] = (songLength >> 16) & 0xFF;
	buffer[10] = (songLength >> 8) & 0xFF;
	buffer[11] = songLength & 0xFF;

	buffer[12] = currentTime >> 24;
	buffer[13] = (currentTime >> 16) & 0xFF;
	buffer[14] = (currentTime >> 8) & 0xFF;
	buffer[15] = currentTime & 0xFF;

	buffer[16] = shuffle;
	buffer[17] = repeat;
	strcpy(buffer+18,title);
  
	unsigned long bytesWritten;

	WriteFile(iCommHandle, buffer, (19+titlelength), &bytesWritten, NULL);
	if (bytesWritten < (19+titlelength))
		Log("Only wrote %d bytes of INF2ACK\r\n", bytesWritten);
	if(iStopEnd && iStopNow) 
		{
			Stop(true);
			iStopEnd = iStopNow = false;
		}
	}
	
void CBemusedServerDlg::SetSeek()
	{
	unsigned long bytesRead = 0;
	unsigned char indexBytes[4];
	int seek = 0;

	if (!ReadFile(iCommHandle, indexBytes, 4,&bytesRead, NULL))
		{
		Log("Couldn't read seek: %d\r\n", GetLastError());
		return;
		}

	seek = (indexBytes[0] << 24) + (indexBytes[1] << 16) +
		   (indexBytes[2] << 8) + indexBytes[3];

	xmms_remote_jump_to_time(0,seek*1000);

	Log("Set seek to %d seconds\r\n", seek);
	}

void CBemusedServerDlg::GetVolume()
{
	unsigned char cVol=(unsigned 
	char)((xmms_remote_get_main_volume(0)*256)/100);
	char buffer[8];
	
	strcpy(buffer, "GVOLACK");
	buffer[7]=cVol;
	
	unsigned long bytesWritten;
	WriteFile(iCommHandle, buffer, 8, &bytesWritten, NULL);
	Log("Send Volume\r\n");
	
}

void CBemusedServerDlg::Version()
{
	char buffer[9];
	strcpy(buffer, "VERSACK");
	buffer[7]=char(1);
	buffer[8]=char(73);
	unsigned long bytesWritten;
	WriteFile(iCommHandle, buffer, 9, &bytesWritten, NULL);
	Log("Send Version Info\r\n");
	
}

void CBemusedServerDlg::RemoveAllFromPlaylist()
	{
	// WARNING:
	//	Can cause issues with some XMMS versions
	xmms_remote_stop(0);
	xmms_remote_playlist_clear(0);
	Log("Removed all songs from playlist\n");
	}

void CBemusedServerDlg::SelectInPlaylist()
	{
	unsigned char indexBytes[2];
	unsigned long bytesRead = 0;
	int pos;

	if (!ReadFile(iCommHandle, indexBytes, 2, &bytesRead, NULL))
		{
		Log("Couldn't read playlist selection: %d\r\n", GetLastError());
		return;
		}

	pos = (indexBytes[0] << 8) + indexBytes[1];
	xmms_remote_set_playlist_pos(0, pos);
	Log("Setting playlist position to %d\n",pos);
	
	}


void CBemusedServerDlg::PlayFile(bool aAddToPlaylist)
	{
	unsigned long bytes = 0;

	unsigned char ubuffer[10];
	char buffer[1024];
	int filenameLength = 0;
	memset(buffer, 0, sizeof(buffer));

//	MessageBox("PLAY");

	if (!ReadFile(iCommHandle, ubuffer, 2, &bytes, NULL))

		{
		Log("Couldn't read filename length: %d\r\n", GetLastError());
		return;
		}

	filenameLength = (ubuffer[0] << 8) + ubuffer[1];

	if (!ReadFile(iCommHandle, buffer, filenameLength, &bytes, NULL))
		{
		Log("Couldn't read filename of length %d: %d\r\n", filenameLength, GetLastError());
		return;
		}
  for (int i=0; i<filenameLength;i++)  if (buffer[i]=='\\') buffer[i]='/';

  // Build up bookpath directory, depending on multiple dirs or not
  if (!strchr(mp3Dirs, ';')) 
     {
	// is base path + magic path
	strcpy(wbookpath,mp3Dirs);
	strcat(wbookpath,"/");
	strcat(wbookpath,bookpath);
     }
  else
     {
	// Is just the magic path
	strcpy(wbookpath,bookpath);
     }
  Log("wbookpath is \"%s\"\n",wbookpath);

  // Bookmarks Check
  if (!strncmp(buffer,wbookpath,strlen(wbookpath)-1))
    {
       char t[1000];
       strcpy(t,&buffer[strlen(wbookpath)]);
       Log("Found bookmark entry %s\n",t);
       
       bool found = false;
       for (int i=0;i<nobookmarks;i++)
	  {
	     if(!strcmp(t,bookmarktitles[i]))
	       {
		  found = true;
		  strcpy(buffer,bookmarks[i]);
	       }
	  }
       if (!found)
	  {
              Log("Error! Unable to find bookmark for title \"%s\"!\n",t);
	      return;
	  }
    }
  Log("About to play file \"%s\"\n",buffer);


	// clear the playlist if required
	if (!aAddToPlaylist)
	  xmms_remote_playlist_clear(0);

  // add this song to the playlist

  GList *list = 0;
  list = g_list_append(list, g_strdup((gchar *)(buffer)));
  xmms_remote_playlist_add(0,list);
  g_list_free(list);
	// start playing!
	if (!aAddToPlaylist)
		{
		Log("Playing \"%s\"\r\n", buffer);
		xmms_remote_play(0);
		}
	else
		{
		Log("Added \"%s\" to playlist\r\n", buffer);
		return;
		}

	int songLength;
	int count = 0;

	do {
		songLength = xmms_remote_get_playlist_time(0,xmms_remote_get_playlist_pos(0));
		usleep(800);
		count++;
		} while ((songLength == -1) && (count < 100));

	}

void CBemusedServerDlg::GetFileInfo()
	{
	unsigned long bytes = 0;

	unsigned char buffer[1024];
	int filenameLength = 0;
	memset(buffer, 0, sizeof(buffer));

	if (!ReadFile(iCommHandle, buffer, 2, &bytes, NULL))
		{
		Log("Couldn't read filename length: %d\r\n", GetLastError());
		return;
		}

	filenameLength = (buffer[0] << 8) + buffer[1];
	buffer[0] = '\0';
	buffer[1] = '\0';

	if (!ReadFile(iCommHandle, buffer, filenameLength, &bytes, NULL))
		{
		Log("Couldn't read filename: %d\r\n", GetLastError());
		return;
		}

  for (int i=0; i<filenameLength;i++)  if (buffer[i]=='\\') buffer[i]='/';

	Log("Returning info about \"%s\": ", buffer);

	FILE* file = fopen((char*) buffer, "rb");

	if (file)
		{
		fseek(file, 0, SEEK_END);
		long fileLength = ftell(file);
		fseek(file, 0, SEEK_SET);
		fclose(file);
		Log("length is %d\r\n", fileLength);

		char ackBuf[11];
		strcpy(ackBuf, "FINFACK");
		ackBuf[7] = (fileLength >> 24) & 0xFF;
		ackBuf[8] = (fileLength >> 16) & 0xFF;
		ackBuf[9] = (fileLength >> 8) & 0xFF;
		ackBuf[10] = fileLength & 0xFF;

		WriteFile(iCommHandle, ackBuf, 11, &bytes, NULL);
		}
	else
		{
		Log("couldn't open file\r\n");
		}

	}


void CBemusedServerDlg::DownloadFile()
	{
	unsigned long bytes = 0;

	unsigned char buffer[1024];
	int filenameLength = 0;
	memset(buffer, 0, sizeof(buffer));

	if (!ReadFile(iCommHandle, buffer, 2, &bytes, NULL))
		{
		Log("Couldn't read filename length: %d\r\n", GetLastError());
		return;
		}

	filenameLength = (buffer[0] << 8) + buffer[1];
	buffer[0] = '\0';
	buffer[1] = '\0';

	if (!ReadFile(iCommHandle, buffer, filenameLength, &bytes, NULL))
		{
		Log("Couldn't read filename: %d\r\n", GetLastError());
		return;
		}
  for (int i=0; i<filenameLength;i++)  if (buffer[i]=='\\') buffer[i]='/';

	Log("Uploading \"%s\"... ", buffer);

	FILE* file = fopen((char*) buffer, "rb");
	unsigned long bytesRead;

	if (file)
		{
		char ackBuf[8];
		strcpy(ackBuf, "DOWNACK");
		WriteFile(iCommHandle, ackBuf, 7, &bytes, NULL);

		do {
			bytesRead = fread(buffer, 1, sizeof(buffer), file);

			if (bytesRead > 0)
				{
				WriteFile(iCommHandle, buffer, bytesRead, &bytes, NULL);
//				if (bytes < bytesRead)
//					Log("wrote %d bytes of %d read from file\r\n", bytes, bytesRead);
				}
			} while (bytesRead > 0);

		Log("finished\r\n");
		}
	else
		{
		Log("couldn't open file\r\n");
		}

	fclose(file);
	}

void CBemusedServerDlg::SetVolume()
	{
	unsigned long bytesRead = 0;
	unsigned char volume = 0;

	if (!ReadFile(iCommHandle, &volume, 1, &bytesRead, NULL))
		{
		Log("Couldn't read volume: %d\r\n", GetLastError());
		return;
		}

	// set the volume

  xmms_remote_set_main_volume(0,(volume*100)/255);

	Log("Set volume to %d%%\r\n", (volume * 100) / 255);
	}

void CBemusedServerDlg::Play()
{
	if (xmms_remote_get_playlist_length(0)) // to prevent open file dialog opening
	{
		xmms_remote_play(0);
		Log("Playing\r\n");
	}
	else
	{
		Log("Received PLAY, but there is nothing to play\r\n");
	}
}

void CBemusedServerDlg::Stop(bool aFadeOut)
	{
	if (aFadeOut)
    	xmms_remote_stop(0);
	else
		xmms_remote_stop(0);

	Log("Stopping\r\n");
	}

void CBemusedServerDlg::Pause()
	{
	xmms_remote_pause(0);
	Log("Pause\r\n");
	}

void CBemusedServerDlg::NextTrack()
	{
	xmms_remote_playlist_next(0);
	Log("Next track\r\n");

	int songLength;
	int count = 0;

	do {
		songLength = xmms_remote_get_playlist_time(0,xmms_remote_get_playlist_pos(0));

		usleep(50);
		count++;
		} while ((songLength == -1) && (count < 100));
	}

void CBemusedServerDlg::PreviousTrack()
	{
	xmms_remote_playlist_prev(0);
	Log("Previous track\r\n");

  int songLength;
	int count = 0;

	do {
		songLength = xmms_remote_get_playlist_time(0,xmms_remote_get_playlist_pos(0));
		usleep(50);
		count++;
		} while ((songLength == -1) && (count < 100));
	}

void CBemusedServerDlg::FastForward()
	{
	int atime=xmms_remote_get_output_time(0);
	xmms_remote_jump_to_time(0,atime+fastforbackspeed);
	Log("Fast forward\r\n");
	}

void CBemusedServerDlg::Check()
	{
	unsigned long bytesWritten;
	char check[]="Y";
	WriteFile(iCommHandle, check, 1, &bytesWritten, NULL);
	}


void CBemusedServerDlg::Rewind()
	{
	int atime=xmms_remote_get_output_time(0);
	atime-=fastforbackspeed;
	if (atime<0) atime=0;
	xmms_remote_jump_to_time(0,atime);
	Log("Rewind\r\n");
	}


void CBemusedServerDlg::Shuffle()
	{
	unsigned long bytesRead = 0;
	unsigned char shuffleOn = 0;

	if (!ReadFile(iCommHandle, &shuffleOn, 1, &bytesRead, NULL))
		{
		Log("Couldn't read shuffle: %d\r\n", GetLastError());
		return;
		}

	if (shuffleOn) {
    if (!xmms_remote_is_shuffle(0)) xmms_remote_toggle_shuffle(0);
    }
  else {
    if (xmms_remote_is_shuffle(0)) xmms_remote_toggle_shuffle(0);
  }

	Log("Changing shuffle to %s\r\n", shuffleOn ? "on" : "off");
	}


void CBemusedServerDlg::Repeat()
	{
	unsigned long bytesRead = 0;
	unsigned char repeatOn = 0;

	if (!ReadFile(iCommHandle, &repeatOn, 1, &bytesRead, NULL))
		{
		Log("Couldn't read repeat: %d\r\n", GetLastError());
		return;
		}

	if (repeatOn) {
    if (!xmms_remote_is_repeat(0)) xmms_remote_toggle_repeat(0);
    }
  else {
    if (xmms_remote_is_repeat(0)) xmms_remote_toggle_repeat(0);
  }

	Log("Changing repeat to %s\r\n", repeatOn ? "on" : "off");
	}

void CBemusedServerDlg::ShutDown()
	{
	Log("Shutting down Linux (only, if you have the right to do so)\r\n");
  system("/sbin/shutdown -h now");
	}

void CBemusedServerDlg::ResetWrittenFlag(CDirTreeNode* aNode)
	{
	aNode->iWrittenToBuffer = false;

	if (aNode->iFirstChild)
		ResetWrittenFlag(aNode->iFirstChild);
	if (aNode->iNextSibling)
		ResetWrittenFlag(aNode->iNextSibling);
	}



void CBemusedServerDlg::WriteListToPhone()
	{
	unsigned long bytesWritten = 0;
	unsigned char buffer[1024];
	unsigned char* bufferPtr;

	// Get a list of the files we can browse.
	char pathBuffer[256];

  strcpy((char*)pathBuffer,mp3Dirs);
	if ((strlen(pathBuffer) > 0) && (pathBuffer[strlen(pathBuffer)-1] == '/'))
	pathBuffer[strlen(pathBuffer)-1] = '\0';


	GenerateFileList(pathBuffer, true);

	WriteFile(iCommHandle, "LISTACK", 7, &bytesWritten, NULL);
	if (bytesWritten < 7)
		{
		Log("Couldn't write list to phone (error %d)\r\n", GetLastError());
		return;
		}

	int sizeLeft;
	int nextPos;
	bool allDone;

	int totalBytesWritten = 0;

	// If we don't have any files, just return end-of-list.
	if (!iDirTreeRoot)
		{
		buffer[0] = 0xFF;
		buffer[1] = 0x00;
		WriteFile(iCommHandle, buffer, 2, &bytesWritten, NULL);
		return;
		}

	iDirTreeCurrentNode = iDirTreeRoot;
	ResetWrittenFlag(iDirTreeRoot);

	do {
		sizeLeft = sizeof(buffer) - 2;

		bufferPtr = buffer;
		memset(buffer, 0, sizeof(buffer));
		allDone = WriteNodeToBuffer(iDirTreeRoot, bufferPtr, sizeLeft);

		totalBytesWritten += (sizeof(buffer) - sizeLeft);
		nextPos = sizeof(buffer) - 2 - sizeLeft;

		if (allDone)
			{
			// Write "last entry" token.
			buffer[nextPos++] = 0xFF;
			buffer[nextPos++] = 0x00;
			}

		bytesWritten = 0;
		WriteFile(iCommHandle, buffer, nextPos, &bytesWritten, NULL);
		if (bytesWritten < (unsigned long) nextPos)
			{
			Log("Couldn't write list to phone (error %d)\r\n", GetLastError());
			return;
			}
		} while (!allDone);

	Log("Wrote song list to phone (%d bytes)\r\n", totalBytesWritten);
	}


void CBemusedServerDlg::WritePlaylistToPhone()
	{
	unsigned long bytesWritten = 0;
	char buffer[1024];
	char eol[2];
	int i;
	int towrite = 0;
	int noentries = 0;
	int playlistpos;

	eol[0] = '\n';
	eol[1] = '\0';

	// Fetch details
	playlistpos = xmms_remote_get_playlist_pos(0);
	noentries = xmms_remote_get_playlist_length(0);

	// Stuff this lot into buffer
	strcpy(buffer, "PLSTACK");
        buffer[7] = (playlistpos >> 8) & 0xFF;
        buffer[8] = playlistpos & 0xFF;

	buffer[9] = '#';
	buffer[10] = '\n'; // need some junk and a \n after the size
			   // winamp achieves this with the m3u header
	towrite = 11;

	// Send this bit on it's way
	WriteFile(iCommHandle, buffer, towrite, &bytesWritten, NULL);
	if (bytesWritten < towrite)
		Log("Only wrote %d bytes of PLSTACK\r\n", bytesWritten);

	// Now pull down and send the playlist
	for(i=0;i<noentries;i++) {
		sprintf(buffer,xmms_remote_get_playlist_title(0,i));
		Log("Track Title is \"%s\"\n",buffer);
		strcat(buffer,eol); // add \n
		towrite=strlen(buffer);

		WriteFile(iCommHandle, buffer, towrite, &bytesWritten, NULL);
		if (bytesWritten < towrite)
			Log("Only wrote %d bytes of PLSTACK\r\n", bytesWritten);
	}

	// Send the end
	buffer[0] = '\0';
	WriteFile(iCommHandle, buffer, 1, &bytesWritten, NULL);
	
	Log("Sent the playlist to the phone, %d entries, position is %d\n",
			noentries,playlistpos);

	}


void CBemusedServerDlg::WriteDirectoryListToPhone()
	{
	unsigned long bytesWritten = 0;
	unsigned char buffer[1024];
	unsigned char* bufferPtr;

	int filenameLength = 0;
	unsigned long bytes;
	memset(buffer, 0, sizeof(buffer));

	if (!ReadFile(iCommHandle, buffer, 2, &bytes, NULL))
		{
		Log("Couldn't read directory name length: %d\r\n", GetLastError());
		return;
		}

	filenameLength = (buffer[0] << 8) + buffer[1];
	buffer[0] = '\0';
	buffer[1] = '\0';
	
	
	if ((filenameLength!=0) && (!ReadFile(iCommHandle, buffer, filenameLength, &bytes, NULL)))
		{
		Log("Couldn't read directory name: %d\r\n", GetLastError());
		return;
		}
		
		
		
	for (int i=0; i<filenameLength;i++)
	{
		if (buffer[i]=='\\') buffer[i]='/';	
	}
	
	if (!strcmp((char*)buffer, ""))
		{
		strcpy((char*)buffer,mp3Dirs);
		if ((strlen((char*)buffer) > 0) && (buffer[strlen((char*)buffer)-1] == '/'))
		buffer[strlen((char*)buffer)-1] = '\0';
		}
	
	//buffer[filenameLength]='/';
		
	char brot[1024];
	strcpy((char*)brot,(char*)buffer);
	brot[filenameLength]='\0';
	
	Log("brot: %s\r\n",brot);
	Log("Listing \"%s\": ", buffer);

	GenerateFileList((char*)buffer, false);

	// Note that we return a standard LISTACK to simplify client-side handling.
	WriteFile(iCommHandle, "LISTACK", 7, &bytesWritten, NULL);
	if (bytesWritten < 7)
		{
		Log("Couldn't write list to phone (error %d)\r\n", GetLastError());
		return;
		}

	int sizeLeft;
	int nextPos;
	bool allDone;

	int totalBytesWritten = 0;

	// If we don't have any files, just return end-of-list.
	if (!iDirTreeRoot)
		{
		buffer[0] = 0xFF;
		buffer[1] = 0x00;
		WriteFile(iCommHandle, buffer, 2, &bytesWritten, NULL);

		Log("no files to list\r\n");
		return;
		}

	iDirTreeCurrentNode = iDirTreeRoot;
	ResetWrittenFlag(iDirTreeRoot);

	do {
		sizeLeft = sizeof(buffer) - 2;

		bufferPtr = buffer;
		memset(buffer, 0, sizeof(buffer));
		allDone = WriteNodeToBuffer(iDirTreeRoot, bufferPtr, sizeLeft);

		totalBytesWritten += (sizeof(buffer) - sizeLeft);
		nextPos = sizeof(buffer) - 2 - sizeLeft;

		if (allDone)
			{
			// Write "last entry" token.
			buffer[nextPos++] = 0xFF;
			buffer[nextPos++] = 0x00;
			}

		bytesWritten = 0;
  	WriteFile(iCommHandle, buffer, nextPos, &bytesWritten, NULL);
		if (bytesWritten < (unsigned long) nextPos)
			{
			Log("Couldn't write list to phone (error %d)\r\n", GetLastError());
			return;
			}
		} while (!allDone);

	Log("wrote list to phone (%d bytes)\r\n", totalBytesWritten);
	}




bool CBemusedServerDlg::WriteNodeToBuffer(CDirTreeNode* aNode, unsigned char*& aBufferPtr, int& aSizeRemaining)
	{
	int lengthNeeded = strlen(aNode->iFileName) + 2;
	if (aSizeRemaining < lengthNeeded)
		return false;

	unsigned char type = (aNode->iNodeType << 4) + aNode->iFileType;

	if (!aNode->iWrittenToBuffer)
		{
		aBufferPtr[0] = type;
		memcpy(&aBufferPtr[1], aNode->iFileName, lengthNeeded - 1);

		aBufferPtr += lengthNeeded;
		aSizeRemaining -= lengthNeeded;

		aNode->iWrittenToBuffer = true;
		}

	int ret = true;

	if (ret && aNode->iFirstChild)
		{
//		iDirTreeCurrentNode = aNode->iFirstChild;
		ret = WriteNodeToBuffer(aNode->iFirstChild, aBufferPtr, aSizeRemaining);
		}

	if (ret)
		{
		if (aNode->iNextSibling)
			{
//			iDirTreeCurrentNode = aNode->iNextSibling;
			ret = WriteNodeToBuffer(aNode->iNextSibling, aBufferPtr, aSizeRemaining);
			}
//		else
//			{
//			if (aNode->iParent && aNode->iParent->iNextSibling)
//				{
//				iDirTreeCurrentNode = aNode->iParent->iNextSibling;
//				ret = WriteNodeToBuffer(iDirTreeCurrentNode, aBufferPtr, aSizeRemaining);
//				}
//			}
		}

//	if (aNode->iFirstChild)
//		iDirTreeCurrentNode = aNode->iFirstChild;

	return ret;
	}




void CBemusedServerDlg::GenerateFileList(const char* aRoot, bool aRecursive)
	{
  delete iDirTreeRoot;
	iDirTreeRoot = NULL;

	if (!strcmp(aRoot, ""))
		return;

	iDirTreeRoot = new CDirTreeNode;
	iDirTreeRoot->iFileType = 0x1; // dir
	iDirTreeRoot->iNodeType = 0x0; // root
	iDirTreeRoot->iFirstChild = iDirTreeRoot->iNextSibling = NULL;
	iDirTreeCurrentNode = iDirTreeRoot;

	// Different handling here based on whether we've only got one directory as our root,
	// or multiple directories.
	if (strchr(aRoot, ';'))
		{
		iDirTreeRoot->iFileName = strdup("");

		char rootPath[1024];
		const char* rootPtr = aRoot;
		CDirTreeNode* newNode;
		CDirTreeNode* lastNewNode;
		int pathCount = 0;
		bool onLastPath = false;

		while (1)
			{
			memset(rootPath, 0, sizeof(rootPath));

			if (!onLastPath)
				{
				strncpy(rootPath, rootPtr, strchr(rootPtr, ';') - rootPtr);
				rootPtr = strchr(rootPtr, ';') + 1;
				}
			else
				{
				strcpy(rootPath, rootPtr);
				}

			// Remove a trailing backslash if there is one.
			if ((strlen(rootPath) > 0) && (rootPath[strlen(rootPath)-1] == '/'))
				rootPath[strlen(rootPath)-1] = '\0';

			// Check that we've got a valid path.
			if (!strcmp(rootPath, ""))
				{
				if (!strchr(rootPtr, ';'))
					onLastPath = true;
				continue;
				}

			pathCount++;

			newNode = new CDirTreeNode;
			newNode->iParent = iDirTreeRoot;
			newNode->iFileName = strdup(rootPath);

			if (aRecursive)
				newNode->iFileType = 0x1; // dir
			else
				newNode->iFileType = 0x3; // unexpanded dir

			if (pathCount == 1)
				{
				iDirTreeRoot->iFirstChild = newNode;
				newNode->iNodeType = 0x1; // child
				}
			else
				{
				lastNewNode->iNextSibling = newNode;
				newNode->iNodeType = 0x3; // sibling
				}

			iDirTreeCurrentNode = newNode;

			if (aRecursive)
				ReadDir(newNode->iFileName, newNode, aRecursive);

			lastNewNode = newNode;

			if (onLastPath)
				break;

			if (!strchr(rootPtr, ';'))
				onLastPath = true;
			}

		// Bookmarks
		if(nobookmarks > 0)
		   {
			AddBookmarks(newNode, iDirTreeRoot, aRecursive);
		   }
		else
		   if (newNode)
			newNode->iNodeType = 0x4; // last sibling
		}
	else
		{
		iDirTreeRoot->iFileName = strdup(aRoot);

		ReadDir(iDirTreeRoot->iFileName, iDirTreeRoot, aRecursive);
		// Bookmarks
		if(nobookmarks > 0)
		   {

		        CDirTreeNode* nNode = iDirTreeRoot->iFirstChild;
			if(nNode->iNodeType == 0x1)
			   {
				nNode = nNode->iFirstChild;
			   }

			if(nNode->iNodeType == 0x2 || nNode->iNodeType == 0x1)
			   {
				   Log("Only child node\n");
			       AddBookmarks(nNode, iDirTreeRoot, aRecursive);
			   }
			else
			   {
			      while(nNode->iNodeType == 0x3)
			         {
			 		Log("Skipping sibling\n");
				     nNode = nNode->iNextSibling;
			         }
			      AddBookmarks(nNode, iDirTreeRoot, aRecursive);
			   }
		   }
		}
	}



void CBemusedServerDlg::AddBookmarks(CDirTreeNode* aNode, CDirTreeNode* pNode, bool aRecursive)
	{

	CDirTreeNode* newNode;
	CDirTreeNode* lastNewNode;

	// aNode is the one we should add after, if any
        if (aNode) 
           {
        	aNode->iNextSibling = new CDirTreeNode;
		aNode->iNodeType=0x3; // Sibling
		newNode = aNode->iNextSibling;
		newNode->iNodeType=0x4; // Last Sibling
           }
	else
	   {
		newNode = new CDirTreeNode;
	        newNode->iNodeType=0x2; // Only Child
		pNode->iFirstChild = newNode;
	   }

	newNode->iParent = pNode;

	// Remove the trailing / from bookpath, then send
	strcpy(wbookpath,bookpath);
	wbookpath[strlen(bookpath)-1]='\0';
	Log("Bookmarks in \"%s\" \"%s\"\n",wbookpath,bookpath);

        newNode->iFileName = wbookpath;

	if (aRecursive)
	   {
		newNode->iFileType = 0x1;
                lastNewNode = newNode;
		newNode = NULL;

		// Bookmark 1
		newNode = new CDirTreeNode;
		newNode->iParent = lastNewNode;
		newNode->iNodeType=0x1;
		newNode->iFileType=0x2;
		newNode->iFileName=bookmarktitles[0];
		lastNewNode->iFirstChild=newNode;

		// Rest
		for(int i=1;i<nobookmarks;i++)
		    {
			newNode->iNextSibling = new CDirTreeNode;
			newNode = newNode->iNextSibling;
			newNode->iParent = lastNewNode;
			newNode->iNodeType=0x3;
			newNode->iFileType=0x2;
			newNode->iFileName=bookmarktitles[i];
		    }

		if(nobookmarks==1)
		        newNode->iNodeType=0x2;
		else
		        newNode->iNodeType=0x4;

	   }
	else
	   {
	        newNode->iNodeType=0x2;
		newNode->iFileType = 0x3;
	   }
	}


int CBemusedServerDlg::BluetoothConnectToSocket(int channel)
	{
   int s=0;

#ifndef AFFIX
    struct sockaddr_rc loc_addr;
#else
   struct sockaddr_affix loc_addr;
   int err;
#endif

struct sockaddr_in iploc_addr;

#ifdef AFFIX
	if (!tcp) {
	  err = sdpreg_init();
	  if (err < 0) {
		 Log("Can not listen on the socket. %s\r\n", strerror(errno));
	      	 exit(1);
		 Log("sdpreg init\n");
	  }
	}
#endif

	int pf;
	int proto;

#ifndef AFFIX
	pf=PF_BLUETOOTH;
#else
	pf=PF_AFFIX;
#endif
	proto=BTPROTO_RFCOMM;

	if (tcp) {
	  pf=PF_INET;
	  proto=IPPROTO_TCP;
	}

	if( (s = socket(pf, SOCK_STREAM, proto)) < 0 ) {
		Log("Can't create socket. %s\r\n", strerror(errno));
		exit(1);
	}

#ifndef AFFIX
	 loc_addr.rc_family = AF_BLUETOOTH;
	 loc_addr.rc_bdaddr = bdaddr;
	 loc_addr.rc_channel = uint8_t(channel);
	 if (!tcp)
	 {
	   char tmpstring[50];
	   sprintf(tmpstring, "sdptool add --channel=%i SP", channel);
	   system(tmpstring);
	   Log("registered SP for channel %i\r\n", channel);
	 }
#else
	 loc_addr.family = AF_AFFIX;
	 loc_addr.bda = bdaddr;
	 loc_addr.port = channel;
#endif
	 if (tcp) {
	   iploc_addr.sin_family = AF_INET;
	   iploc_addr.sin_port = htons(tcpport);
	   struct in_addr lokaleip;
	   lokaleip.s_addr=INADDR_ANY;
	   iploc_addr.sin_addr = lokaleip;
	 }
	 struct sockaddr* socketaddr=(struct sockaddr *)&loc_addr;
	 if (tcp) socketaddr=(struct sockaddr *)&iploc_addr;

	 if( bind(s, socketaddr, sizeof(*socketaddr)) < 0 ) {
		 Log("Can't bind socket. %s, %f\r\n", strerror(errno),float(s));
		 exit(1);
	 }

	 if( listen(s, 10) ) {
		 Log("Can not listen on the socket. %s\r\n", strerror(errno));

		 exit(1);
	 }

#ifdef AFFIX
	if (!tcp) {
	   err = sdpreg_serialport(channel);
	   if (err < 0) {
    		 Log("Can not listen on the socket. %s\r\n", strerror(errno));
		 exit(1);
	   }
	   Log("reg ser port\n");
	}
#endif
  return s;

	}


int CBemusedServerDlg::BluetoothWaitforConnect(int s)
  {
   int s1=0,opt;
#ifndef AFFIX
   bdaddr_t ba;
   struct sockaddr_rc rem_addr;
#else
   BD_ADDR ba;
   struct sockaddr_affix   rem_addr;
#endif
   struct sockaddr_in iprem_addr;

   if (!tcp) Log("Waiting for connection over bluetooth\r\n"); else
   	     Log("Waiting for conection over TCP/IP (Port: %i)\r\n",tcpport);

   struct sockaddr* socketaddr=(struct sockaddr *)&rem_addr;
   if (!tcp)
   {
   	opt = sizeof(rem_addr);
   }
   else
   {
	opt = sizeof(iprem_addr);
	socketaddr=(struct sockaddr *)&iprem_addr;
   }
	 if( (s1 = accept(s, socketaddr, (socklen_t *)&opt)) < 0 )
	 {
			Log("Accept failed. %s\r\n", strerror(errno));
			exit(1);
   	 }

   if (!tcp)
   {
#ifndef AFFIX
   	baswap(&ba, &rem_addr.rc_bdaddr);
#else
   	baswap(&ba, &rem_addr.bda);
#endif
   	Log("Connect from %s\r\n", batostr(&ba));
   }
   else
   {
	Log("Connect from %s\r\n", inet_ntoa(iprem_addr.sin_addr));
   }


   return s1;
  }


void CBemusedServerDlg::Log(char* aFormatString, ...)
	{
  char logBuffer[1024];
  va_list argList;
	va_start(argList, aFormatString);
	vsprintf(logBuffer, aFormatString, argList);
	va_end(argList);
	cout << logBuffer;
	}


char* CBemusedServerDlg::GetLastError()
  {
  return strerror(errno);
  }
3nigma666 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 09:23   #8
3nigma666
Senior Member
 
L'Avatar di 3nigma666
 
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
da quanto ho capito io l'errore lo segnala quando c'è l'ereditarietà della classe
CBemusedServerDlg::classe_che_eredita ... non riesco a capire dove sia la ridondanza, e soprattutto come correggerla...
3nigma666 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 10:39   #9
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7263
Quote:
Originariamente inviato da 3nigma666 Guarda i messaggi
questo è il sorgente...
non riesco a trovare l'errore

Codice:
...
questo è il file BemusedServerDlg.cpp evidentemente.. l'errore è in BemusedServerDlg.h! prova a postare quello
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 10:41   #10
3nigma666
Senior Member
 
L'Avatar di 3nigma666
 
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
questo è il file BemusedServerDlg.cpp evidentemente.. l'errore è in BemusedServerDlg.h! prova a postare quello
azzo... sorry...


Codice:
#define MAX_PATH 1024


/////////////////////////////////////////////////////////////////////////////
// CDirTreeNode class

class CDirTreeNode
	{
public:
	CDirTreeNode();
	~CDirTreeNode();

	unsigned char iNodeType;
	unsigned char iFileType;
	char* iFileName;

	bool iWrittenToBuffer;

	CDirTreeNode* iParent;
	CDirTreeNode* iFirstChild;
	CDirTreeNode* iNextSibling;
	};


/////////////////////////////////////////////////////////////////////////////
// CBemusedServerDlg dialog

class CBemusedServerDlg
{
// Construction
public:
	CBemusedServerDlg();	// standard constructor
	~CBemusedServerDlg();
	bool OnInitDialog(bool daemonize = false);

// Implementation

private:
	int BluetoothConnectToSocket(int Channel);
  int BluetoothWaitforConnect(int s);
	void ReadBluetoothCommand();
	void HandleBluetooth();

	bool CheckWinamp(const char* aWindowName);
  bool CBemusedServerDlg::ReadFile(int handle,char* buffer,int maxbytes,long unsigned int* bytesread,int* bla);
  bool CBemusedServerDlg::ReadFile(int handle,unsigned char* buffer,int maxbytes,long unsigned int* bytesread,int* bla);
  bool CBemusedServerDlg::WriteFile(int handle, char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla);
  bool CBemusedServerDlg::WriteFile(int handle,unsigned char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla);
  char* CBemusedServerDlg::GetLastError();

	void WriteListToPhone();
	void WriteDirectoryListToPhone();
	void WritePlaylistToPhone();

	void WriteInfoToPhone();
	void WriteInf2ToPhone();
	void WriteDetailedInfoToPhone();
	void Play();
	void PlayFile(bool aAddToPlaylist);
	void GetFileInfo();
	void SetSeek();
	void DownloadFile();
	void SetVolume();
	void GetVolume();
	void Version();
	void SelectInPlaylist();
	void RemoveAllFromPlaylist();
	void Stop(bool aFadeOut);
	void Pause();
	void NextTrack();
	void PreviousTrack();
	void FastForward();
	void Rewind();
	void Shuffle();
	void Repeat();
	void ShutDown();
	void Check();
	void FadeOut();
	void ReadIniFile();

	void CBemusedServerDlg::AddBookmarks(CDirTreeNode* aNode, CDirTreeNode* pNode, bool aRecursive);
	void GenerateFileList(const char* aRoot, bool aRecursive);
	void ReadDir(char* aDir, CDirTreeNode* aNode, bool aRecursive);
	bool WriteNodeToBuffer(CDirTreeNode* aNode, unsigned char*& aBufferPtr, int& aSizeRemaining);
	void ResetWrittenFlag(CDirTreeNode* aNode);

	void Log(char* aFormatString, ...);

	CDirTreeNode* iDirTreeRoot;
	CDirTreeNode* iDirTreeCurrentNode;

	int iCommHandle;
	bool iExitNow;
	bool iStopEnd;
	bool iStopNow;

  int startAutomatically;
  char winampPath[256];
  char bookmarkfile[256];
  char bookmarks[100][256];  // stream URLS
  char bookmarktitles[100][100];  // stream Titles
  int nobookmarks;
  int socket1;
  int channel;
  int fastforbackspeed;
  char mp3Dirs[1024];
  bool tcp;
  int tcpport;
  int lastTime;
};
3nigma666 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 10:46   #11
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7263
esattamente..
Codice:
  bool CBemusedServerDlg::ReadFile(int handle,char* buffer,int maxbytes,long unsigned int* bytesread,int* bla);
  bool CBemusedServerDlg::ReadFile(int handle,unsigned char* buffer,int maxbytes,long unsigned int* bytesread,int* bla);
  bool CBemusedServerDlg::WriteFile(int handle, char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla);
  bool CBemusedServerDlg::WriteFile(int handle,unsigned char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla);
  char* CBemusedServerDlg::GetLastError();
e
Codice:
void CBemusedServerDlg::AddBookmarks(CDirTreeNode* aNode, CDirTreeNode* pNode, bool aRecursive);
devono diventare rispettivamente
Codice:
  bool ReadFile(int handle,char* buffer,int maxbytes,long unsigned int* bytesread,int* bla);
  bool ReadFile(int handle,unsigned char* buffer,int maxbytes,long unsigned int* bytesread,int* bla);
  bool WriteFile(int handle, char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla);
  bool WriteFile(int handle,unsigned char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla);
  char* GetLastError();
e
Codice:
void AddBookmarks(CDirTreeNode* aNode, CDirTreeNode* pNode, bool aRecursive);
e il gioco è fatto
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 11:03   #12
3nigma666
Senior Member
 
L'Avatar di 3nigma666
 
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
GRANDISSIMOOOOO SEI UN DRAGOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
3nigma666 è offline   Rispondi citando il messaggio o parte di esso
Old 12-07-2007, 11:18   #13
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7263
Quote:
Originariamente inviato da 3nigma666 Guarda i messaggi
GRANDISSIMOOOOO SEI UN DRAGOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
beh veramente c'era scritto tutto nel messaggio di errore
buona compilazione!
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2007, 10:20   #14
eclissi83
Senior Member
 
L'Avatar di eclissi83
 
Iscritto dal: Jan 2001
Messaggi: 2289
beh ora che avete risolto il problema, che si faccia la patch e la si invii al team di sviluppo...

su gente, contribuire contribuire
__________________
FreeBSD, OpenBSD and GNU/Linux User
Free Software Foundation Associate Member
proudly member of poco-serio™ team!
nella foto son quello simpatico... l'altro e' |Stan|
eclissi83 è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2007, 13:15   #15
3nigma666
Senior Member
 
L'Avatar di 3nigma666
 
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
ho già avvisato lo sviluppatore

ecco la versione corretta:


/*
This file is part of Bemused.

Bemused 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.

Bemused 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 Bemused; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Copyright (C) 2003 Ashley Montanaro and Daniel Winter.
*/


#define MAX_PATH 1024


/////////////////////////////////////////////////////////////////////////////
// CDirTreeNode class

class CDirTreeNode
{
public:
CDirTreeNode();
~CDirTreeNode();

unsigned char iNodeType;
unsigned char iFileType;
char* iFileName;

bool iWrittenToBuffer;

CDirTreeNode* iParent;
CDirTreeNode* iFirstChild;
CDirTreeNode* iNextSibling;
};


/////////////////////////////////////////////////////////////////////////////
// CBemusedServerDlg dialog

class CBemusedServerDlg
{
// Construction
public:
CBemusedServerDlg(); // standard constructor
~CBemusedServerDlg();
bool OnInitDialog(bool daemonize = false);

// Implementation

private:
int BluetoothConnectToSocket(int Channel);
int BluetoothWaitforConnect(int s);
void ReadBluetoothCommand();
void HandleBluetooth();

bool CheckWinamp(const char* aWindowName);
bool ReadFile(int handle,char* buffer,int maxbytes,long unsigned int* bytesread,int* bla);
bool ReadFile(int handle,unsigned char* buffer,int maxbytes,long unsigned int* bytesread,int* bla);
bool WriteFile(int handle, char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla);
bool WriteFile(int handle,unsigned char* buffer,int maxbytes, long unsigned int* byteswritten,int* bla);
char* GetLastError();

void WriteListToPhone();
void WriteDirectoryListToPhone();
void WritePlaylistToPhone();

void WriteInfoToPhone();
void WriteInf2ToPhone();
void WriteDetailedInfoToPhone();
void Play();
void PlayFile(bool aAddToPlaylist);
void GetFileInfo();
void SetSeek();
void DownloadFile();
void SetVolume();
void GetVolume();
void Version();
void SelectInPlaylist();
void RemoveAllFromPlaylist();
void Stop(bool aFadeOut);
void Pause();
void NextTrack();
void PreviousTrack();
void FastForward();
void Rewind();
void Shuffle();
void Repeat();
void ShutDown();
void Check();
void FadeOut();
void ReadIniFile();

void AddBookmarks(CDirTreeNode* aNode, CDirTreeNode* pNode, bool aRecursive);
void GenerateFileList(const char* aRoot, bool aRecursive);
void ReadDir(char* aDir, CDirTreeNode* aNode, bool aRecursive);
bool WriteNodeToBuffer(CDirTreeNode* aNode, unsigned char*& aBufferPtr, int& aSizeRemaining);
void ResetWrittenFlag(CDirTreeNode* aNode);

void Log(char* aFormatString, ...);

CDirTreeNode* iDirTreeRoot;
CDirTreeNode* iDirTreeCurrentNode;

int iCommHandle;
bool iExitNow;
bool iStopEnd;
bool iStopNow;

int startAutomatically;
char winampPath[256];
char bookmarkfile[256];
char bookmarks[100][256]; // stream URLS
char bookmarktitles[100][100]; // stream Titles
int nobookmarks;
int socket1;
int channel;
int fastforbackspeed;
char mp3Dirs[1024];
bool tcp;
int tcpport;
int lastTime;
};

grazie a voi !!
3nigma666 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
L’ex CEO di Intel Gelsinger punta su una...
Techly, quattro nuovi supporti TV fra mo...
Mass Effect sacrificato per Star Wars: i...
Gemini, addio al copia e incolla per cor...
13 miliardi per un colpo di stato? NVIDI...
L'agente AI Wabi crea mini-app su misura...
Edge è il primo browser a supportare Acc...
L'IA di Firefox ora compila i moduli da ...
Tracking pixel nelle email: cosa cambia ...
La GeForce RTX 5080 da 24 GB potrebbe ar...
Apple mette alle strette OpenAI, la caus...
Xbox ancora in calo: ecco com'è a...
Car of the Year 2027: sette finaliste e ...
Google Beam cambia tutto: arrivano le vi...
Curry Barker, il regista di Obsession, p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:45.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v